对各种排序算法的实现
1.冒泡排序:
1 #include "stdio.h" 2 #define N 100005 3 4 void Swap(int *x,int *y){ int k=*x; *x=*y; *y=k; } 5 6 void Bubble_sort(int st,int en,int *a) //冒泡排序 7 { 8 int i,j; 9 for(i=en; i>st; i--)10 {11 for(j=st; j a[j+1]) Swap(&a[j],&a[j+1]);13 }14 }15 16 int main()17 {18 int n;19 int a[N];20 scanf("%d",&n);21 for(int i=0; i
2.快速排序:
1 #include "stdio.h" 2 #define N 100005 3 4 void T_sort(int st,int en,int *a) //快速排序 5 { 6 if(st>=en) return ; 7 int l=st,r=en; 8 int temp = a[st]; //以子表的首记录作为支点记录,放入temp变量 9 while(l=temp)12 --r;13 if(l
3.希尔排序:
1 #include "stdio.h" 2 #define N 100005 3 4 void Shell_sort_in_k(int *a,int n,int dk) 5 { 6 int i,j,k; 7 for(i=1; i<=dk; ++i) 8 { 9 for(j=i+dk; j<=n; j+=dk)10 {11 a[0] = a[j];12 for(k=j-dk; k>0&&a[0]
4.堆排序:
1 #include "stdio.h" 2 #define N 100005 3 4 void Swap(int *x,int *y) { int k=*x; *x=*y; *y=k; } 5 6 void Heap_sort_k(int *a,int st,int en) //将a[st]~a[en]建成大根堆 7 { 8 int j; 9 int temp = a[st];10 for(j=2*st; j<=en; j*=2)11 {12 if(j= a[j]) break;14 a[st] = a[j];15 st = j;16 }17 a[st] = temp; //将temp插入到s位置上18 }19 20 void Heap_sort(int *a,int n)21 {22 for(int i=n/2; i>0; i--)23 Heap_sort_k(a,i,n); //将a[1]~a[n]建成大根堆24 for(int i=n; i>1; i--)25 {26 Swap(&a[1],&a[i]); //将堆顶记录与当前未排序的子序列a[]中最后一个记录相互交换27 Heap_sort_k(a,1,i-1); //将a[1..i-1]重新调整为大根堆28 }29 }30 31 int main()32 {33 int n;34 int a[N];35 scanf("%d",&n);36 for(int i=1; i<=n; i++) scanf("%d",&a[i]); //堆排序要从下标1开始存起37 Heap_sort(a,n);38 for(int i=1; i<=n; i++) printf("%d ",a[i]);39 printf("\n");40 }
5.归并排序:
1 #include "stdio.h" 2 #define N 100005 3 int c[N]; //辅助空间 4 5 void Merge(int *a,int st,int mid,int en) 6 { 7 int i=st,j=mid+1,k=0; 8 while(i<=mid && j<=en) //将两段区间由小到大并入c[]; 9 {10 if(a[i]<=a[j])11 c[k++]=a[i++];12 else13 c[k++]=a[j++];14 }15 if(i<=mid) //将剩余的a[i..mid]复制到c[];16 while(i<=mid) c[k++]=a[i++];17 if(j<=en) //将剩余的a[j..en]复制到c[];18 while(j<=en) c[k++]=a[j++];19 for(i=st; i<=en; i++)20 a[i]=c[i-st];21 }22 23 void Merge_sort(int *a,int st,int en) //归并排序24 {25 if(st==en) return ;26 int mid = (st+en)/2;27 Merge_sort(a,st,mid); //递归的对a[st~mid]进行归并排序28 Merge_sort(a,mid+1,en); //递归的对a[mid+1~en]进行归并排序29 Merge(a,st,mid,en); //两子数组归并为有序30 }31 32 int main()33 {34 int n;35 int a[N];36 scanf("%d",&n);37 for(int i=0; i
6.基数排序:
排序合集:
1 #include "stdio.h" 2 #include "string.h" 3 4 #define N 10005 5 6 void Swap(int *x,int *y) //交换 7 { 8 int t; 9 t = *x; 10 *x = *y; 11 *y = t; 12 } 13 14 void Shell_sort_in_k(int *a,int n,int dk) //对顺序表a进行一趟增量为dk的Shell排序,dk为步长因子 15 { 16 int i,j,k; 17 for(i=1; i<=dk; ++i) //当前有dk个子序列,共插入排序dk次 18 { 19 for(j=i+dk; j<=n; j+=dk) //对每一个子序列进行插入排序 20 { 21 a[0] = a[j]; //当前要插入的元素为a[j]; 22 for(k=j-dk; k>0&&a[0] =r) return ; 43 int start = l; 44 int end = r; 45 while(l=temp) 48 --r; 49 if(l = a[j]) break; 70 a[start] = a[j]; 71 start = j; 72 } 73 a[start] = temp; //将temp插入到s位置上 74 } 75 76 void Heap_sort(int *a,int n) //堆排序 77 { 78 int i; 79 for(i=n/2; i>0; i--) 80 Heap_sort_k(a,i,n); //将a[1]~a[n]建成大根堆 81 for(i=n; i>1; i--) 82 { 83 Swap(&a[1],&a[i]); //将堆顶记录与当前未排序的子序列a[]中最后一个记录相互交换 84 Heap_sort_k(a,1,i-1); //将a[1..i-1]重新调整为大根堆 85 } 86 } 87 88 int c[N]; // 辅助空间 89 90 void Merge(int *a,int start,int mid,int end) //将a[start~mid]与a[mid+1~end]合并; 91 { 92 int m,n; 93 int i,j,k; 94 i = start; m = mid; 95 j = mid+1; n = end; 96 k = 0; 97 for( ; i<=m && j<=n; ++k) //将两段区间由小到大并入c[]; 98 { 99 if(a[i]