今天课上所听的9种排序!

来源:互联网 发布:理肤泉b5真假知乎 编辑:程序博客网 时间:2024/06/05 19:22
#include <stdio.h>


//交换函数
void swap(int a[],int i,int j)
{
int tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
//打印函数
void printA(int *a,int len)
{
int i;
for(i=0;i<len;i++)
{
printf("%4d",a[i]);
}
printf("\n");
}
//冒泡排序
int main1()
{
int a[10]={2,4,6,1,7,9,3,8,0,5};
int len=sizeof(a)/sizeof(a[0]);

int i,j;

for(i=0;i<len-1;i++)
{
for(j=0;j<len-i-1;j++)
{
if(a[j]>a[j+1])
{
swap(a,j,j+1);
}
}
}
printA(a,len);
return 0;
}
//鸡尾酒排序
int main2()
{
int a[10]={2,4,6,1,7,9,3,8,0,5};
int len=sizeof(a)/sizeof(a[0]);

int i;
int left=0;
int right=len-1;

while(left<right)
{
for(i=left;i<right;i++)
{
if(a[i]>a[i+1])
{
swap(a,i,i+1);
}
}
right--;
for(i=right;i>left;i--)
{
if(a[i-1]>a[i])
{
swap(a,i,i-1);
}
}
left++;
}

printA(a,len);
return 0;
}
//选择排序
int main3()
{
int a[10]={2,4,6,1,7,9,3,8,0,5};
int len=sizeof(a)/sizeof(a[0]);

int i,j;
int min;//保存最小数的下标

for(i=0;i<len-1;i++)
{
min=i;
for(j=i+1;j<len;j++)
{
if(a[min]>a[j])
{
min=j;
}
}
if(min!=i)
{
swap(a,i,min);
}
}
printA(a,len);
return 0;
}


//插入排序
int main4()
{
int a[10]={2,4,6,1,7,9,3,8,0,5};
int len=sizeof(a)/sizeof(a[0]);

int get;
int i,j;

for(i=1;i<len;i++)
{
get=a[i];  //抓牌
j=i-1;

while(j>=0&&a[j]>get)
{
a[j+1]=a[j];
j--;
}
a[j+1]=get;
}
printA(a,len);

return 0;
}
//二分插入排序
int main5()
{
int a[10]={2,4,6,1,7,9,3,8,0,5};
int len=sizeof(a)/sizeof(a[0]);

int left,right,mid,i,j,get;

for(i=1;i<len;i++)
{
get=a[i];
left=0;
right=i-1;

while(left<=right)
{
mid=(left+right)/2;
if(a[mid]>get)
{
right=mid-1;
}
else
{
left=mid+1;
}
}

for(j=i-1;j>=left;j--)
{
a[j+1]=a[j];
}
a[left]=get;
}
printA(a,len);

return 0;
}


//希尔排序
int main6()
{
int a[10]={2,4,6,1,7,9,3,8,0,5};
int len=sizeof(a)/sizeof(a[0]);

int i,j,get;
int d=len;
do
{
d=d/3+1;
for(i=d;i<len;i++)
{
get=a[i];
j=i-d;

while(j>=0&&a[j]>get)
{
a[j+d]=a[j];
j-=d;
}
a[j+d]=get;
}
}while(d>1);

printA(a,len);
return 0;
}


//堆排序
void heapify(int *a,int i,int len)
{
int left=2*i+1;
int right=2*i+2;
int max=i;

if(left<len&&a[left]>a[max])
max=left;
if(right<len&&a[right]>a[max])
max=right;

if(max!=i)
{
swap(a,i,max);
heapify(a,max,len);
}
}


void heapsort(int *a,int len)
{
//建堆
int i;
for(i=len/2-1;i>=0;i--)
{
heapify(a,i,len);
}

//排序
for(i=len-1;i>0;i--)
{
swap(a,0,i);
len--;
heapify(a,0,len);
}
}


int main7()
{
int a[10]={2,4,6,1,7,9,3,8,0,5};
int len=sizeof(a)/sizeof(a[0]);

heapsort(a,len);
printA(a,len);

return 0;
}


//归并排序
void merge(int *a,int left,int mid,int right,int *tmp)
{
int i=left;
int j=mid+1;
int k=0;

while(i<=mid&&j<=right)
{
if(a[i]>a[j])
tmp[k++]=a[j++];
else
tmp[k++]=a[i++];
}

while(i<=mid)
tmp[k++]=a[i++];

while(j<=right)
tmp[k++]=a[j++];

k=0;
for(i=left;i<=right;i++)
{
a[i]=tmp[k++];
}
}


void mergesort(int *a,int left,int right,int *tmp)
{
if(left>=right)
return;

int mid=(left+right)/2;
mergesort(a,left,mid,tmp);
    mergesort(a,mid+1,right,tmp);
merge(a,left,mid,right,tmp);
}


int main8()
{
int a[10]={2,4,6,1,7,9,3,8,0,5};
int len=sizeof(a)/sizeof(a[0]);

int tmp[10];
mergesort(a,0,len-1,tmp);
printA(a,len);

return 0;
}


//快速排序
int partition(int *a,int left,int right)
{
int pivot=a[right];
int index=left;
int i;
for(i=left;i<right;i++)
{
if(a[i]<pivot)
{
swap(a,i,index);
index++;
}
}
swap(a,index,right);
return index;
}


void qsort(int *a,int left,int right)
{
if(left<right)
{
int pivot=partition(a,left,right);
qsort(a,left,pivot-1);
qsort(a,pivot+1,right);
}
}


int main9()
{
int a[10]={2,4,6,1,7,9,3,8,0,5};
int len=sizeof(a)/sizeof(a[0]);

qsort(a,0,len-1);
printA(a,len);

return 0;
}