排序算法
排序算法应该也是面试中会经常问到的问题。 /汗 现在就只会快速排序和归并排序。前两天看《算法导论》的堆排序,自己没能写出,代码都写出来了,就是通过不了测试,等过两天再写堆排序吧,今天先把快速排序和归并写了。嗯,而且要开始学 STL了,要不然笔试的时候算法都自己写,太耗时间了。
快速排序 时间复杂度平均为O(nlogn) 最差为O(n^2) 采用随机快速排序来避免这种情况
1 int Partition(int arr[],int lo,int hi) 2 { 3 //随机化的快速排序,避免O(n^2) 4 swap(arr[lo],arr[lo+rand()%(hi-lo+1)]); 5 int t = arr[lo]; 6 while(lo<hi) 7 { 8 while(lo<hi && arr[hi]>=t) 9 --hi; 10 arr[lo] = arr[hi]; 11 12 while(lo<hi && arr[lo]<=t) 13 ++lo; 14 arr[hi] = arr[lo]; 15 } 16 arr[lo] = t; 17 return t; 18 } 19 20 void QuickSort(int arr[],int lo,int hi) 21 { 22 if (hi-lo<2) return; 23 while(lo<hi) 24 { 25 int mi = Partition(arr,lo,hi); 26 QuickSort(arr,lo,mi); 27 QuickSort(arr,mi+1,hi); 28 } 29 }
归并排序 时间复杂度稳定在O(logn)
1 void MergeSort(int arr[],int lo,int hi) 2 { 3 if (hi-lo<2) return; 4 int mi = (lo+hi)>>1; 5 //以中点为界分别排序 6 MergeSort(arr,lo,mi); 7 MergeSort(arr,mi,hi); 8 Merge(arr,lo,mi,hi); 9 } 10 11 void Merge(int arr[],int lo,int mi,int hi) 12 { 13 int *A = arr + lo; 14 int lb = mi-lo; 15 int *B = new int [lb]; //前子向量 16 for (int i=0;i<lb;B[i++]=A[i++]); //复制前子向量 17 int lc = hi-mi; 18 int *C = arr + mi; //后子向量 19 for (int i=0,j=0,k=0;(j<lb) || (k<lc)) 20 { 21 //加B 22 if ((j<lb) && (!(k<lc)||B[j]<=C[k])) A[i++] = B[j++]; 23 //加C 24 if ((k<lc) && (!(j<lb)||B[j]> C[k])) A[i++] = C[k++]; 25 } 26 delete []B; 27 }
先给堆排序留个坑,最大堆,最小堆,优先队列
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。