终于把常用的排序算法写完了,发下自己记录一下。
#include <stdio.h> //------------------------------------------------------------ //交换函数 void swap(int *a,int *b) { int temp; temp = *a; *a=*b; *b=temp; } //------------------------------------------------------------ //选择排序 //时间复杂度:O(n^2) int sort_select(int *a,int len) { int i,j; int flag=0; int temp=0; for(i=0;i<len;i++) { temp=a[i]; flag = i; for(j=i;j<len;j++) { if(a[j]<temp) { flag=j; temp=a[j]; } } a[flag]=a[i]; a[i]=temp; } } //------------------------------------------------------------ //直接插入排序 //时间复杂度:O(n^2) int sort_insert(int *a,int len) { int i,j; int temp; for(i=1;i<len;i++) { temp=a[i]; for(j=i-1;j>=0;j--) { if(temp<a[j]) { a[j+1] = a[j]; } else { break; } } a[j+1] = temp; } return 1; } //------------------------------------------------------------ //冒泡法排序 //时间复杂度:O(n^2) int sort_bubbling(int *a,int len) { int i,j; int temp; for(i=1;i<len-1;i++) { for(j=0;j<len-i;j++) { if(a[j]>a[j+1]) { temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; } } } return 1; } //------------------------------------------------------------ //双向冒泡排序 //时间复杂度:O(n^2) int sort_bubbling2(int *a,int len) { int j; int left=1; int right = len-1; int t; do{ //反向冒泡 从后往前 for(j=right;j>=left;j--) { if(a[j]<a[j-1]) { swap(&a[j],&a[j-1]); t =j; } } //顺序冒泡 从前往后 left =t+1; for(j=left;j<right;j++) { if(a[j]<a[j-1]) { swap(&a[j],&a[j-1]); t=j; } } right = t-1; }while(left<=right); return 1; } //------------------------------------------------------------ //归并排序 //时间复杂度:O(nlogn) void merge(int *a,int p,int q,int r) { int i,j; int k; int n1 = q-p+1; int n2 = r-q; int left[n1]; int right[n2]; for(i=0,k=p;i<n1;i++,k++) left[i] = a[k]; for(i=0,k=q+1;i<n2;i++,k++) right[i] = a[k]; for(i=0,j=0,k=p;i<n1&&j<n2;k++) { if(left[i]<right[j]) { a[k] = left[i]; i++; } else { a[k] = right[j]; j++; } } if(i<n1) for(;i<n1;i++,k++) a[k]=left[i]; if(j<n2) for(;j<n2;j++,k++) a[k] = right[j]; } int mergesort(int *a,int p,int r) { int q; if(p<r) { q=(p+r)/2; mergesort(a,p,q); mergesort(a,q+1,r); merge(a,p,q,r); } } int sort_merge(int *a,int len) { mergesort(a,0,len-1); } //------------------------------------------------------------ //快速排序 //时间复杂度:O(nlogn) int quicksort(int *a,int l,int r) { int index; int left =l; int right = r; if(l>=r) return; index = a[left]; while(left<right) { while(left<right && a[right]>index) right--; if(left<right) a[left++] = a[right]; while(left<right && a[left]<index) left++; if(left<right) a[right--] = a[left]; } a[left] = index; quicksort(a,l,left-1); quicksort(a,left+1,r); } int sort_quick(int *a,int len) { quicksort(a,0,len-1); } //------------------------------------------------------------ //希尔排序 //时间复杂度:O(nlogn) int sort_shell(int *a,int len) { int i,j; int h; int temp; for(h=len/2;h>0;h=h/2) { for(i=h;i<len;i++) { temp = a[i]; for(j=i-h;j>=0;j-=h) { if(temp < a[j]) { a[j+h] = a[j]; } else { break; } } a[j+h] = temp; } } } //------------------------------------------------------------ //堆排序 //时间复杂度:O(nlogn) int heapmax(int *a,int i,int len) { int lchild=2*i; int rchild=2*i+1; int max=i; if(i<=len/2) { if(lchild<=len && a[lchild-1]>a[max-1]) { max = lchild; } if(rchild<=len && a[rchild-1]>a[max-1]) { max = rchild; } if(max != i) { swap(&a[i-1],&a[max-1]); heapmax(a,max,len); } } } int sort_heapmax(int *a,int len) { //create heap int i; for(i=len/2;i>=1;i--) { heapmax(a,i,len); } //heap sort for(i=len;i>1;i--) { swap(&a[0],&a[i-1]); heapmax(a,1,i-1); } } //测试用例 int main(void) { int a[] = {1,23,3,4,5,6,87,34,3,77,77,3,56,100}; int a_select[] = {1,23,3,4,5,6,87,34,3,77,77,3,56,100}; int a_insert[] = {1,23,3,4,5,6,87,34,3,77,77,3,56,100}; int a_bubbling[] = {1,23,3,4,5,6,87,34,3,77,77,3,56,100}; int a_bubbling2[] = {1,23,3,4,5,6,87,34,3,77,77,3,56,100}; int a_merge[] = {1,23,3,4,5,6,87,34,3,77,77,3,56,100}; int a_quick[] = {1,23,3,4,5,6,87,34,3,77,77,3,56,100}; int a_shell[] = {1,23,3,4,5,6,87,34,3,77,77,3,56,100}; int a_heap[] = {1,23,3,4,5,6,87,34,3,77,77,3,56,100}; int i; int len = sizeof(a)/sizeof(a[0]); printf("the originala data: \n"); for(i=0;i<len;i++) printf("%d,",a[i]); printf("\n"); printf("insert:\n"); sort_insert(a_insert,len); for(i=0;i<len;i++) printf("%d,",a_insert[i]); printf("\n"); printf("select:\n"); sort_select(a_select,len); for(i=0;i<len;i++) printf("%d,",a_select[i]); printf("\n"); printf("bubbling:\n"); sort_bubbling(a_bubbling,len); for(i=0;i<len;i++) printf("%d,",a_bubbling[i]); printf("\n"); printf("bubbling2:\n"); sort_bubbling2(a_bubbling2,len); for(i=0;i<len;i++) printf("%d,",a_bubbling2[i]); printf("\n"); printf("merge:\n"); sort_merge(a_merge,len); for(i=0;i<len;i++) printf("%d,",a_merge[i]); printf("\n"); printf("quick:\n"); sort_quick(a_quick,len); for(i=0;i<len;i++) printf("%d,",a_quick[i]); printf("\n"); printf("shell:\n"); sort_shell(a_shell,len); for(i=0;i<len;i++) printf("%d,",a_shell[i]); printf("\n"); printf("heap:\n"); sort_heapmax(a_heap,len); for(i=0;i<len;i++) printf("%d,",a_heap[i]); printf("\n"); }