见
稳定性:
注:相等元素不交换
稳定:冒泡、插入、归并、基数
不稳定:选择、快速、堆、希尔
实现:
希尔排序:
1 void shellSort(int v[],int n) 2 { 3 int gap,i,j,tmp; 4 for(gap=n/2;gap>0;gap/=2) 5 { 6 for(i=gap;i=0 && v[j]>v[j+gap];j-=gap) 9 {10 tmp=v[j];11 v[j]=v[j+gap];12 v[j+gap]=tmp;13 }14 }15 }16 }
快速排序:
(这里提供四个实现,前两个实现以首元素为枢纽元,后两个实现可以指定枢纽元的位置,前两个实现可以看做是后两个实现的特例)
1 void swap(int *a,int *b) 2 { 3 int tmp=*a; 4 *a=*b; 5 *b=tmp; 6 } 7 void quickSort1(int a[],int s,int e)//第一个元素作为枢纽元 8 { 9 if(s>=e) return; 10 int i=s+1; 11 int j=e; 12 while(1) 13 { 14 //若用do while循环,则 初始i=s;j=t+1; do{i++;}while(!(a[i]>=a[s] || i==t)); do{j--;}while(!(a[j]<=a[s] || j==s)); 15 while(is && a[j]>a[s])//或j>=s也可 20 { 21 j--; 22 } 23 24 if(i =e) return; 40 int i=s; 41 int j=s; 42 while(++i <= e) 43 { 44 if(a[i] =e) return; 56 57 int pivot=(s+e)/2;//指定枢纽元 58 59 int i=s; 60 int j=e; 61 while(1) 62 { 63 //若用do while循环,则 初始i=s-1;j=t+1; do{i++;}while(!(a[i]>=a[pivot] || i==t)); do{j--;}while(!(a[j]<=a[pivot] || j==s)); 64 while(i s && a[j]>a[pivot])//或j>=s也可 69 { 70 j--; 71 } 72 73 if(i =e) return; 92 93 int pivot=(s+e)/2;//指定枢纽元 94 95 int i=s-1; 96 int j=s-1; 97 while(++i <= e) 98 { 99 if(a[i]