排序算法总结
更新日期:
文章目录
排序算法总结
插入排序n2 快速排序nlog2n 不稳 希尔排序 n1.3 不稳
选择排序n2不稳 堆排序nlog2n 不稳 基数排序O(d(n+1))
冒泡排序n2 归并排序nlog2n
冒泡排序
1 | void BubbleSort(int a[],int n) { int i,j; for(i=0;i<n;i++) for(j=1;j<n-i;j++) if(a[j-1]>a[j]) Swap(a[j-1],a[j]); } |
快速排序
1 | #include<cstdio> #include<ctime> #include<cstdlib> void Swap(int& a,int& b){if(a!=b){a^=b;b^=a;a^=b int Partition(int *A,int p,int r) { int x,i; x=A[r]; i=p-1; for(int j=p;j<=r-1;++j) { if(A[j]<=x) Swap(A[++i],A[j]); //x为最后一个数,小于x,不动(交换)本身(未有大于x的) //已有大于x的时,再遇小于x:交换 } Swap(A[++i],A[r]); return i; } void QuickSort(int *A,int p,int r) { if(p<r) { int q = Partition(A,p,r); QuickSort(A,p,q-1); QuickSort(A,q+1,r); } } |
堆排序
1 | #include<cstdio> #include<algorithm> using namespace std; //《算法导论》堆排序采用最大堆,最小堆通常用于构造最小优先队列 inline int Parent(int i){return i>>1;} inline int Left(int i){return i<<1;} inline int Right(int i){return (i<<1) | 1; } inline void Swap(int &a,int &b){if(a!=b) {a^=b;b^=a;a^=b;}} //保持堆的性质 void MAXHeap(int *A,int heap_size,int i) { int l,r,max; l = left(i); r = Right(i); if(l<=heap_size && A[l]>A[j]) max = l; else max = i; if(r<=heap_size && A[r]>A[max]) max = r; if(max!=i) { Swap(A[i],A[max]);//就地排序 MAXHeap(A,heap_size,max); } } 建堆 void BuildMAXHeap(int* A,int heap_size) { for(int i = heap_size>>1;i>=1;--i) MAXHeap(A,heap_size,i); } 排序 void HeapSort(int* A,int heap_size) { BuildMAXHeap(A,heap_size); int len = heap_size; for(int i=heap_size;i>=2;--j) { Swap(A[1],A[i]); --len; MAXHeap(A,len,1); } } |
归并排序
1 | //归并排序 O(nlog2n) 附加空间O(n) #include<stdio.h> #define true 1 #define false 0 void mergearray(int a[],int first,int mid,int last,int temp[]) { int i = first,j = mid+1; int m = mid,n = last; int k = 0; while(i<=m && j<=n) { if(a[i]<a[j]) temp[k++] = a[i++]; else temp[k++] = a[j++]; } while(i<m) temp[k++] = a[i++]; while(j<n) temp[k++] = a[j++]; for(i=0;i<k;i++) a[first] = temp[i]; } void mergesort(int a[],int first,int last,int temp[]) { if(first<last) { int mid = (first+last)/2; mergesort(a,first,mid,temp); mergesort(a,mid+1,last,temp); mergearray(a,first,mid,last,temp); } } int MergeSort(int a[],int n) { int* p = (int*)malloc(n*sizeof(int));//共用临时数组 if(p == NLL)//内存分配不成功,申请空间是否成功。 return false; mergesort(a,0,n-1,p free(p); return true; } int main() { int i; int a[] = {23,4,9,34,12,3,89,7,80}; MergeSort(a,q); for(i=0;i<q;i++) printf("%d",a[i]); printf("\n"); return 0; } |
希尔排序
1 | 希尔排序:插入排序的改进。递减增量排序算法。 步长为1时就是插入排序。 #include<stdio.h> void ShellSort(int a[],int n) { int i,j,k,temp,gap; int gaps[]={1,5,13,43,113,297,815,1989,4711,11969,27901,84801,213331}; for(k=0;gap[k]<n;k++) while(--k>=0) { gap = gaps[k]; for(i=gap;i<n;i++) { j=i-gap; temp=a[i]; while((j>=0)&&(a[j]>temp)) { a[j+gap] = a[j]; j=j-gap; } a[j+gap] = temp; } } } 或者: void shellSort(int* data,size_t size) { for(int gap = size/2;gap>0;gap/=2) for(int i=gap;i<size;++i) { int key = data[i]; int j=0; for(j=i-gap;j>=0&&data[j]>key;j-=gap) { data[j+gap] = data[j]; } data[j+gap] = key; } } |