几种常见的排序算法

来源:互联网 发布:站长工具 ip查域名 编辑:程序博客网 时间:2024/05/06 10:51
这个是我用C语言编写的几种常见的排序算法代码,都是经过我用数据测试的,具体的算法时间复杂度和算法稳定性没有做详细说明,这些网上都可以查到,我就不在此啰嗦了!希望这些算法能给有用的人一点点帮助!
#include
#include

void Swap(int &a,int &b)
{
int c=b;
b=a;
a=c;
}

//冒泡排序
void Sortint1(int num[],int len)
{
for(int i=0;i
for(int j=i;j
{
if(num[i]>num[j+1])
{
Swap(num[i],num[j+1]);
}
}
}

//选择排序
void selectsort(int num[],int len)
{
int min=0;
for(int i=0;i
{
min=i;
for(int j=i+1;j
{
if(num[min]>num[j])
min = j;
}

if(min!=i)
{
Swap(num[i],num[min]);
}
}
}

//直接插入排序
void insertsort(int num[],int len)
{
int temp=0;
for(int i=1;i
{
temp=num[i];
for(int j=i;(j>0) && (num[j-1]>temp);--j)
{
num[j] = num[j-1];
}
num[j]=temp;
}
}

//快速排序
void quicksort(int num[],int len)
{
int i=0,j=len-1;
int val = num[0];
if(len>1)
{
while(i
{
for (;j>i;--j)
{
if(num[j]
{
num[i]=num[j];
break;
}
}
for(;j>i;++i)
{
if(num[i]>val)
{
num[j]=num[i];
break;
}
}
}

num[i]=val;
quicksort(num,i);
quicksort(num+i+1,len-i-1);
}
}

//希尔排序
void shellsort(int num[],int len)
{
int temp=0;
for(int d=len/2;d>=1;d=d/2)
{
for(int i=d;i
{
temp = num[i];
for(int j=i-d;(j>=0) && (num[j]>temp);j=j-d)
{
num[j+d]=num[j];
}
num[j+d]=temp;
}
}
}

//二路归并排序
void Merge(int num[],int tag[],int start,int mid,int end)
{
int i=0,j=0,k=start;
for(i=start,j=mid+1;i<=mid && j<=end;k++)
{
if(num[i]<=num[j])
{
tag[k]=num[i++];
}
else
{
tag[k]=num[j++];
}
}

while(i<=mid)
{
tag[k++]=num[i++];
}

while(j<=end)
{
tag[k++]=num[j++];
}

for(int n=start;n<=end;n++)
{
num[n]=tag[n];
}
}

void MergeSort(int num[],int tag[],int start,int end)
{
if(start
{
int mid = (start+end)/2;
MergeSort(num,tag,start,mid);
MergeSort(num,tag,mid+1,end);
Merge(num,tag,start,mid,end);
}
}

//堆排序

void FilterDown(int *&heap,int start,int end)
{
int i = start;
int j = i*2+1;
int temp = heap[i];

while(j<=end)
{
if(j
if(heap[j]<=temp)break;
heap[i]=heap[j];
i=j;
j=2*i+1;
}

heap[i]=temp;
}

void CreapHeap(int *&heap,int len,int ar[])
{
heap = (int *)malloc(sizeof(int)*len);

for(int i=0;i
{
heap[i]=ar[i];
}

int pos=len/2;

while(pos>=0)
{
FilterDown(heap,pos,len-1);
--pos;
}
}

void Compositor(int *&heap,int len)
{
for(int i=len-1;i>0;--i)
{
Swap(heap[0],heap[i]);
int pos=i/2;
while(pos>=0)
{
FilterDown(heap,pos,i-1);
--pos;
}
}
}

int main()
{
int num[]={95,45,15,0,78,84,51,24,12};
int len = sizeof(num)/sizeof(num[0]);

// Sortint1(num,len);
// selectsort(num,len);
// insertsort(num,len);
// quicksort(num,len);

// shellsort(num,len);
int tag[9]={0};

int *heap=NULL;
CreapHeap(heap,len,num);
Compositor(heap,len);
// MergeSort(num,tag,0,len-1);
for(int i=0;i
{
printf("%d  ",heap[i]);
}

printf("\n");
free(heap);

return 0;
}
0 0