排序小结(C版)
一、快速排序(C源码)
#include <stdlib.h> #include <stdio.h> int adjust(int a[],int start,int end) { int i=start; int j=end; int temp=a[start]; while(i<j) { while(i<j&&temp<a[j]) j--; if(i<j) { a[i]=a[j]; i++; } while(i<j&&temp>=a[i]) i++; if(i<j) { a[j]=a[i]; j--; } } a[i]=temp; return i; } void print_array(int array[], int n) { int i; for( i = 0 ; i < n ; ++i ) printf("%d ", array[i]); printf("\n"); } void quiksort(int a[],int start,int end) { if(start<end) { int m=adjust(a,start,end); quiksort(a,start,m-1); quiksort(a,m+1,end); } } int main() { int array[] = {65, 2, 68, 1, 9, 78,65}; quiksort(array, 0, 6); print_array(array, 7); system("pause"); return 0; }
二、堆排序
#include <stdlib.h> #include <stdio.h> //最大堆的调整函数 //注意a[0]不参与排序 void adjust(int a[],int s,int m) { int temp=a[s]; int j; for(j=2*s;j<=m;j=2*j) { if(j<m&&a[j]<a[j+1]) j++; if(temp>a[j]) break; a[s]=a[j]; s=j; } a[s]=temp; } //堆排序函数 void heapsort(int a[],int n) { int i; int temp; for(i=n/2;i>=1;i--) adjust(a,i,n); for(i=n;i>1;i--) { temp=a[1]; a[1]=a[i]; a[i]=temp; adjust(a,1,i-1); } } void print_array(int array[], int n) { int i; for( i = 0 ; i < n ; ++i ) printf("%d ", array[i]); printf("\n"); } int main() { int array[] = {-999,65, 2, 68, 1, 9, 78,65}; heapsort(array,7); print_array(array, 8); system("pause"); return 0; }
三、 二路归并排序
#include <stdlib.h> #include <stdio.h> //合并相邻的两个有序组 //a[u,...,v-1]和a[v,...,t] void merge(int a[],int b[],int u,int v,int t) { int i,j,k; i=u; j=v; k=u; while(i<=v-1&&j<=t) { if(a[i]<=a[j]) b[k++]=a[i++]; else b[k++]=a[j++]; } while(i<=v-1) { b[k++]=a[i++]; } while(j<=t) { b[k++]=a[j++]; } } void onepass(int a[],int b[],int s,int n) { int u,v,t; u=0; v=s; t=2*s-1; while(n-u>=2*s) { merge(a,b,u,v,t); u+=2*s; v+=2*s; t+=2*s; } if(n-u>s) merge(a,b,u,v,n-1); else { for(;u<n;u++) b[u]=a[u]; } } void mergesort(int a[],int n) { int s=1; int i; int *b=(int*)malloc(n*sizeof(int)); while(s<n) { onepass(a,b,s,n); s=2*s; if(s>=n) { for(i=0;i<n;i++) a[i]=b[i]; } else { onepass(b,a,s,n); s=2*s; } } free(b); } void print_array(int array[], int n) { int i; for( i = 0 ; i < n ; ++i ) printf("%d ", array[i]); printf("\n"); } int main() { int array[] = {-999,1,2,65,90,9,65,78,3}; mergesort(array,9); print_array(array, 9); system("pause"); return 0; }
二路归并排序(2)
#include <stdlib.h> #include <stdio.h> //合并相邻的两个有序组 //a[u,...,v-1]和a[v,...,t] void merge(int a[],int b[],int u,int v,int t) { int i,j,k; i=u; j=v; k=u; while(i<=v-1&&j<=t) { if(a[i]<=a[j]) b[k++]=a[i++]; else b[k++]=a[j++]; } while(i<=v-1) { b[k++]=a[i++]; } while(j<=t) { b[k++]=a[j++]; } } void onepass(int a[],int b[],int s,int n) { int u,v,t; u=0; v=s; t=2*s-1; while(n-u>=2*s) { merge(a,b,u,v,t); u+=2*s; v+=2*s; t+=2*s; } if(n-u>s) merge(a,b,u,v,n-1); else { for(;u<n;u++) b[u]=a[u]; } } void mergesort(int a[],int n) { int s; int i; int *b=(int*)malloc(n*sizeof(int)); for(s=1;s<n;s=2*s) { onepass(a,b,s,n); s=2*s; if(s>=n) { for(i=0;i<n;i++) a[i]=b[i]; } else onepass(b,a,s,n); } } void print_array(int array[], int n) { int i; for( i = 0 ; i < n ; ++i ) printf("%d ", array[i]); printf("\n"); } int main() { int array[] = {-999,1,2,65,90,9,65,78,3}; mergesort(array,9); print_array(array, 9); system("pause"); return 0; }
四、冒泡排序
#include <stdlib.h> #include <stdio.h> void bubblesort(int a[],int n) { int i,j; int chage=1; int temp; for(i=n-1;chage&&i>0;i--) { chage=0; for(j=0;j<i;j++) { if(a[j]>a[j+1]) { temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; chage=1; } } } } void print_array(int array[], int n) { int i; for( i = 0 ; i < n ; ++i ) printf("%d ", array[i]); printf("\n"); } int main() { int array[] = {-999,1,2,65,90,9,65,78,3}; bubblesort(array,9); print_array(array, 9); system("pause"); return 0; }
五、直接选择排序
#include <stdlib.h> #include <stdio.h> void selectsort(int a[],int n) { int i,j; int k,max; //记录最大值下标和最大值 for(i=n-1;i>=1;i--) { k=i; max=a[i]; for(j=0;j<i;j++) { if(a[j]>max) { max=a[j]; k=j; } } a[k]=a[i]; a[i]=max; } } void print_array(int array[], int n) { int i; for( i = 0 ; i < n ; ++i ) printf("%d ", array[i]); printf("\n"); } int main() { int array[] = {-999,1,2,65,90,9,65,78,3}; selectsort(array,9); print_array(array, 9); system("pause"); return 0; }