C语言实现几大典型排序
2013-09-17 20:44
211 查看
1 简单选择排序
适合数据个数n较小的情况,思想是在n个待排序数据中选出最小的,通过n-i次关键字的比较,从n-i-1个记录中选出最小的,并和第i个关键字交换;
平均时间复杂度是O(n的平方)代码如下:
void selectSort(int p[],int n){
//从小到大排序
int k,temp;
for(int i=0;i<n;i++){
k=i;
for(int j=i;j<n;j++){
if(p[k]>p[j]) k=j;
}
if(i!=k)
{
temp=p[k];
p[k]=p[i];
p[i]=temp;
}
}
}
2 插入排序 (衍生的有希尔排序)
主要思想是将一个数插入到一个有序数列中,平均时间复杂度是O(n的平方),主要代码如下:
void insertSort(int *p,int n){ //从大到小
int temp;
int k;
for(int i=1;i<n;i++)
{
k=p[i];
if(p[i]>p[i-1])
{
int j;
p[i]=p[i-1];
for(j=i-2;j>=0;--j){
if(p[j]<p[j+1])
p[j+1]=p[j];
}
p[j+1]=k;
}
}
}
3 快速排序
主要思想是通过一趟排序,将待排序列分割成2半,左边的均比关键字小,右边的都比关键字大,平均时间复杂度是O(nlogn),空间复杂度是O(logn)。主要代码如下:
void quickSort(int *p,int m,int n){
if(m<n){
int i=m;
int j=n;
int temp;
while(i<j){
while(i<n)
if(p[i]>p[m])
break;
else
i++;
while(j>m)
if(p[j]<p[m])
break;
else
j--;
if(i<j)
{
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
}
temp=p[j];
p[j]=p[m];
p[m]=temp;
quickSort(p,m,j-1);
quickSort(p,i,n);
}
}
4 堆排序
时间复杂度不管是最好,最差还是平均的情况下都是O(logn),主要代码如下
#include <iostream>
#include<stdio.h>
using namespace std;
void heapAdjust(int *p,int m,int n){
int temp=p[m];
for(int i=m*2;i<n;i=i*2){
if(p[i]<p[i+1]) i++;
if(temp>=p[i]) break;
p[m]=p[i];
m=i;
}
p[m]=temp;
}
void HeapSort(int *p,int n){
int temp;
for(int i=(n-1)/2;i>=0;--i)
heapAdjust(p,i,n);
for(int j=n-1;j>0;--j){
temp=p[0];
p[0]=p[j];
p[j]=temp;
heapAdjust(p,0,j-1);
}
}
int main(){
int a[10]={2,5,3,1,6,7,4,10,45,34};
HeapSort(a,10);
printf("排序后数据如下:");
for(int i=0;i<10;i++)
{
printf("%d ",a[i]);
}
getchar();
return 0;
}
适合数据个数n较小的情况,思想是在n个待排序数据中选出最小的,通过n-i次关键字的比较,从n-i-1个记录中选出最小的,并和第i个关键字交换;
平均时间复杂度是O(n的平方)代码如下:
void selectSort(int p[],int n){
//从小到大排序
int k,temp;
for(int i=0;i<n;i++){
k=i;
for(int j=i;j<n;j++){
if(p[k]>p[j]) k=j;
}
if(i!=k)
{
temp=p[k];
p[k]=p[i];
p[i]=temp;
}
}
}
2 插入排序 (衍生的有希尔排序)
主要思想是将一个数插入到一个有序数列中,平均时间复杂度是O(n的平方),主要代码如下:
void insertSort(int *p,int n){ //从大到小
int temp;
int k;
for(int i=1;i<n;i++)
{
k=p[i];
if(p[i]>p[i-1])
{
int j;
p[i]=p[i-1];
for(j=i-2;j>=0;--j){
if(p[j]<p[j+1])
p[j+1]=p[j];
}
p[j+1]=k;
}
}
}
3 快速排序
主要思想是通过一趟排序,将待排序列分割成2半,左边的均比关键字小,右边的都比关键字大,平均时间复杂度是O(nlogn),空间复杂度是O(logn)。主要代码如下:
void quickSort(int *p,int m,int n){
if(m<n){
int i=m;
int j=n;
int temp;
while(i<j){
while(i<n)
if(p[i]>p[m])
break;
else
i++;
while(j>m)
if(p[j]<p[m])
break;
else
j--;
if(i<j)
{
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
}
temp=p[j];
p[j]=p[m];
p[m]=temp;
quickSort(p,m,j-1);
quickSort(p,i,n);
}
}
4 堆排序
时间复杂度不管是最好,最差还是平均的情况下都是O(logn),主要代码如下
#include <iostream>
#include<stdio.h>
using namespace std;
void heapAdjust(int *p,int m,int n){
int temp=p[m];
for(int i=m*2;i<n;i=i*2){
if(p[i]<p[i+1]) i++;
if(temp>=p[i]) break;
p[m]=p[i];
m=i;
}
p[m]=temp;
}
void HeapSort(int *p,int n){
int temp;
for(int i=(n-1)/2;i>=0;--i)
heapAdjust(p,i,n);
for(int j=n-1;j>0;--j){
temp=p[0];
p[0]=p[j];
p[j]=temp;
heapAdjust(p,0,j-1);
}
}
int main(){
int a[10]={2,5,3,1,6,7,4,10,45,34};
HeapSort(a,10);
printf("排序后数据如下:");
for(int i=0;i<10;i++)
{
printf("%d ",a[i]);
}
getchar();
return 0;
}
相关文章推荐
- C语言 实现两种排序方法
- 排序系列之(1)归并排序及C语言实现
- C语言快速排序实现
- C语言分别实现冒泡排序、快速排序、选择排序
- C语言实现排序算法---桶(箱)排序
- 查找与排序之冒泡排序篇(C语言实现)
- C语言实现单向链表及其各种排序(含快排,选择,插入,冒泡)
- 用纯C语言实现快速排序,分递归调用法和非递归调用法。
- 插入排序的C语言实现
- c语言实现特殊排序
- 数据排序的几种方法(c语言实现)
- C语言单向动态链表程序,实现链表的建立,合并,重新排序,链表元素的插入与删除,以及根据元素成员的值进行元素删除。
- 快速排序,C语言实现
- 排序(5)---------高速排序(C语言实现)
- C语言链表中数组实现数据选择排序,升序、降序功能主要难点
- 排序(6)---------归并排序(C语言实现)
- 小根堆对数组排序C语言算法实现
- C语言——常见的几种排序的实现
- 快速排序的C语言实现【严蔚敏--数据结构】
- 快速排序的实现(c语言)