总结了一下常用的排序,可能面试的时候会用到
总结了才发现有那么多奇奇怪怪的排序算法,还有的以前都没听说过
参考http://www.cnblogs.com/kkun/archive/2011/11/23/2260312.html
1.插入排序
void insertion(int arr[], int n) { int i, j; for(i=1;i<n;i++) { for(j=0;j<i;j++) { if(arr[j]>arr[i]) break; } int temp = arr[i]; for(int k=i-1;k>=j;k--) { arr[k+1]=arr[k]; } arr[j]=temp; } }
2.冒泡排序
void bubble(int arr[], int n) { for(int i=0;i<n;i++) { for(int j=0;j<n-i-1;j++) { if(arr[j]>arr[j+1]) { int temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } }
3.堆排序
void heapify(int arr[], int n, int i) { int mmax = i; if(2*i+2<n && arr[mmax]<arr[2*i+2]) { mmax = 2*i+2; } if(2*i+1<n && arr[mmax]<arr[2*i+1]) { mmax = 2*i+1; } if(mmax!=i) { int temp = arr[mmax]; arr[mmax]=arr[i]; arr[i]=temp; heapify(arr, n, mmax); } } void make(int arr[], int n) { for(int i=n/2;i>=0;i--) { heapify(arr, n, i); } } void heap_sort(int arr[], int n) { int t=n; make(arr, n); for(int i=n;i>0;i--) { int temp=arr[i-1]; arr[i-1]=arr[0]; arr[0]=temp; t--; heapify(arr, t, 0); } }
4.快速排序
int part(int arr[], int p, int r) { int temp=arr[r]; int i=p; for(int j=p;j<=r-1;j++) { if(arr[j]>temp) { j++; } else { int t=arr[j]; arr[i]=arr[j]; arr[j]=t; i++; } } arr[r]=arr[i]; arr[i]=temp; return i; } void quick_sort(int arr[], int p, int r) { if(p<r) { int q = part(arr, p, r); quick_sort(arr, p, q-1); quick_sort(arr, q+1, r); } }
5.归并排序
void merge(int arr[], int p, int q, int r) { int i, j, k; int *temp=new int[r-p+1]; i=p; j=q+1; k=0; while(i<=q && j<=r) { if(arr[i]<arr[j]) { *(temp+k)=arr[i]; i++; } else { *(temp+k)=arr[j]; j++; } k++; } while(i<=q) { *(temp+k)=arr[i]; k++; i++; } while(j<=r) { *(temp+k)=arr[j]; k++; j++; } j=0; for(i=p;i<=r;i++) { arr[i]=*(temp+j); j++; } } void merge_sort(int arr[], int p, int r) { if(p<r) { int q=(p+r)/2; merge_sort(arr, p, q); merge_sort(arr, q+1, r); merge(arr,p,q,r); } }
6.桶排序
void bucket_sort(int arr[], int n)//不知道这样写可不可以 { int mmax=arr[0]; int mmin=arr[0]; for(int i=0;i<n;i++) { if(arr[i]>mmax) mmax=arr[i]; if(arr[i]<mmin) mmin=arr[i]; } int *p = new int[mmax-mmin+1]; memset(p, INT_MAX, mmax-mmin+1); for(int i=0;i<n;i++) { *(p+arr[i]-mmin)=arr[i]-mmin; } int j=0; for(int i=0;i<mmax-mmin+1;i++) { if(*(p+i)!=INT_MAX) { arr[j]=*(p+i); j++; } } }
7.鸡尾酒排序
冒泡排序的一种改进,向两端冒泡
void cock_sort(int arr[], int n) { int i=0, j=0, k=0; int exchange; for(i=0;i<n;i++) { exchange=0; for(j=i;j<n-i-1;j++) { if(arr[j]>arr[j+1]) { int temp=arr[j+1]; arr[j+1]=arr[j]; arr[j]=temp; exchange++; } } if(exchange==0) break; exchange=0; for(k=n-i-1;k>i;k--) { if(arr[k]<arr[k-1]) { int temp=arr[k-1]; arr[k-1]=arr[k]; arr[k]=temp; exchange++; } } if(exchange==0) break; } }
8.地精排序
void gno_sort(int arr[], int n) { int i=0; while(i<n) { if(i==0) i++; else { if(arr[i-1]>arr[i]) { int temp=arr[i-1]; arr[i-1]=arr[i]; arr[i]=temp; i--; } else i++; } } }
9.奇偶排序
void oddeven_sort(int arr[], int n) { int ex=1; while(ex) { ex=0; for(int i=0;i<n-1;i+=2) { if(arr[i]>arr[i+1]) { int temp=arr[i+1]; arr[i+1]=arr[i]; arr[i]=temp; ex++; } } ex=0; for(int i=1;i<n-1;i+=2) { if(arr[i]>arr[i+1]) { int temp=arr[i+1]; arr[i+1]=arr[i]; arr[i]=temp; ex++; } } } }
10.梳排序
void comb_sort(int arr[], int n) { int t=n; while(t>1) { if((int)t/1.3>=3) { t=(int)t/1.3; } else { t--; } for(int i=0;i<n-t;i++) { if(arr[i]>arr[i+t]) { int temp=arr[i+t]; arr[i+t]=arr[i]; arr[i]=temp; } } } }
11.计数排序
#include<iostream> using namespace std; void count_sort(int arr[], int n, int b[], int c[], int lenc) { for(int i=0;i<lenc;i++) { c[i]=0; } for(int i=0;i<n;i++) { c[arr[i]]++; } for(int i=1;i<lenc;i++) { c[i]=c[i]+c[i-1]; } for(int i=0;i<n;i++) { b[c[arr[i]]-1]=arr[i]; c[arr[i]]--; } } int main() { int a[]={1,4,2,8,6,7,15,0,5,3}; int len=sizeof(a)/sizeof(int); int mmax = 0; for(int i=0;i<len;i++) { if(a[i]>mmax) mmax=a[i]; } mmax++; int *c = new int[mmax]; int *b = new int[len]; count_sort(a, len, b, c, mmax); for(int i=0;i<len;i++) { cout<<b[i]<<" "; } cout<<endl; return 0; }