1、冒泡排序
#include <stdio.h>
void mySwap(int *a,int i,int j)
{
int tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
void mySort1(int *a,int len)
{
int i,j;
for(i=0;i<len-1;i++)
{
for(j=0;j<len-1-i;j++)
{
if(a[j]>a[j+1])
{
mySwap(a,j,j+1);
}
}
}
}
void mySort(int *a,int len)
{
if(len==1)
return;
int j;
for(j=0;j<len-1;j++)
{
if(a[j]>a[j+1])
{
mySwap(a,j,j+1);
}
}
mySort(a,len-1);
}
void myPrint(int *a,int len)
{
int i;
for(i=0;i<len;i++)
{
printf("%d ",a[i]);
}
}
int main()
{
int a[]={9,8,7,6,5,4,3,2,1,0};
int len=sizeof(a)/sizeof(a[0]);
mySort(a,len);
myPrint(a,len);
printf("\n");
}
2、鸡尾酒排序
#include <stdio.h>
void mySwap(int *a,int i,int j)
{
int tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
void mySort1(int *a,int len)
{
int left=0;
int right=len-1;
int j;
while(left<right)
{
for(j=left;j<right;j++)
{
if(a[j]>a[j+1])
{
mySwap(a,j,j+1);
}
}
right--;
for(j=right;j>left;j--)
{
if(a[j]<a[j-1])
{
mySwap(a,j,j-1);
}
}
left++;
}
}
void mySort(int *a,int left,int right)
{
if(left>=right)
return;
int j;
for(j=left;j<right;j++)
{
if(a[j]>a[j+1])
{
mySwap(a,j,j+1);
}
}
right--;
for(j=right;j>left;j--)
{
if(a[j]<a[j-1])
{
mySwap(a,j,j-1);
}
}
left++;
mySort(a,left,right);
}
void myPrint(int *a,int len)
{
int i;
for(i=0;i<len;i++)
{
printf("%d ",a[i]);
}
}
int main()
{
int a[]={9,8,7,6,5,4,3,2,1,0};
int len=sizeof(a)/sizeof(a[0]);
mySort(a,0,len-1);
myPrint(a,len);
printf("\n");
}
3、选择排序
#include <stdio.h>
void mySwap(int *a,int i,int j)
{
int tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
void mySort(int *a,int len)
{
int i,j;
for(i=0;i<len-1;i++)
{
int min=i;//把
for(j=i+1;j<len;j++)
{
if(a[min]>a[j])
{
min=j;
}
}
if(a[i]!=a[min])
{
mySwap(a,i,min);
}
}
}
void myPrint(int *a,int len)
{
int i;
for(i=0;i<len;i++)
{
printf("%d ",a[i]);
}
}
int main()
{
int a[]={9,8,7,6,5,4,3,2,1,0};
int len=sizeof(a)/sizeof(a[0]);
mySort(a,len);
myPrint(a,len);
printf("\n");
}
4、插入排序
#include <stdio.h>
void mySwap(int *a,int i,int j)
{
int tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
void mySort(int *a,int len)
{
int i,j,get;
for(i=1;i<len;i++)
{
get=a[i];
j=i-1;
while(a[j]>get&&j>=0)
{
a[j+1]=a[j];
j--;
}
a[j+1]=get;
}
}
void myPrint(int *a,int len)
{
int i;
for(i=0;i<len;i++)
{
printf("%d ",a[i]);
}
}
int main()
{
int a[]={9,8,7,6,5,4,3,2,1,0};
int len=sizeof(a)/sizeof(a[0]);
mySort(a,len);
myPrint(a,len);
printf("\n");
}
5、二分法插入排序
void mySwap(int *a,int i,int j)
{
int tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
void mySort(int *a,int len)
{
int i,j,get;
for(i=1;i<len;i++)
{
get=a[i];
int left=0;
int right=i-1;
while(left<=right)
{
int mid=(left+right)/2;
if(a[mid]>get)
{
right=mid-1;
}
else
{
left=mid+1;
}
}
int j;
for(j=i-1;j>=left;j--)
{
a[j+1]=a[j];
}
a[left]=get;
}
}
void myPrint(int *a,int len)
{
int i;
for(i=0;i<len;i++)
{
printf("%d ",a[i]);
}
}
int main()
{
int a[]={9,8,7,6,5,4,3,2,1,0};
int len=sizeof(a)/sizeof(a[0]);
mySort(a,len);
myPrint(a,len);
printf("\n");
}
6、希尔排序
#include <stdio.h>
void mySwap(int *a,int i,int j)
{
int tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
void mySort(int *a,int len)
{
int i,j,get,gap;
while(gap<len)
{
gap=gap*3+1;
}
while(gap>0)
{
for(i=gap;i<len;i++)
{
get=a[i];
j=i-gap;
while(a[j]>get&&j>=0)
{
a[j+gap]=a[j];
j-=gap;
}
a[j+gap]=get;
}
gap=gap/3;
}
}
void myPrint(int *a,int len)
{
int i;
for(i=0;i<len;i++)
{
printf("%d ",a[i]);
}
}
int main()
{
int a[]={9,8,7,6,5,4,3,2,1,0};
int len=sizeof(a)/sizeof(a[0]);
mySort(a,len);
myPrint(a,len);
printf("\n");
}
7、堆排序
#include <stdio.h>
void mySwap(int *a,int i,int j)
{
int tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
void herify(int *a,int index,int len)
{
int lindex=index*2+1;
int rindex=index*2+2;
int max=index;
if(lindex<=len-1&&a[lindex]>a[max])
max=lindex;
if(rindex<=len-1&&a[rindex]>a[max])
{
max=rindex;
}
if(max!=index)
{
mySwap(a,index,max);
herify(a,max,len);
}
}
void mySort(int *a,int len)
{
int i;
for(i=len/2-1;i>=0;i--)
{
herify(a,i,len);
}
int count=len;
for(i=len-1;i>0;i--)
{
mySwap(a,0,i);
count--;
herify(a,0,count);//或者不需要count,直接用i
}
}
void myPrint(int *a,int len)
{
int i;
for(i=0;i<len;i++)
{
printf("%d ",a[i]);
}
}
int main()
{
int a[]={9,8,7,6,5,4,3,2,1,0};
int len=sizeof(a)/sizeof(a[0]);
mySort(a,len);
myPrint(a,len);
printf("\n");
}
8、归并排序
#include <stdio.h>
void mySwap(int *a,int i,int j)
{
int tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
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[i++];
}
else
{
tmp[k++]=a[j++];
}
}
while(i<=mid)
{
tmp[k++]=a[i++];
}
while(j<=right)
{
tmp[k++]=a[j++];
}
for(i=0;i<k;i++)
{
a[left+i]=tmp[i];
}
}
void mergesort(int *a,int left,int right,int *tmp)
{
int mid=(left+right)/2;
if(left<right)
{
mergesort(a,left,mid,tmp);
mergesort(a,mid+1,right,tmp);
merge(a,left,mid,right,tmp);
}
}
void myPrint(int *a,int len)
{
int i;
for(i=0;i<len;i++)
{
printf("%d ",a[i]);
}
}
int main()
{
int a[]={9,8,7,6,5,4,3,2,1,0};
int tmp[10];
int len=sizeof(a)/sizeof(a[0]);
mergesort(a,0,9,tmp);
myPrint(a,len);
printf("\n");
}