几种排序的优质写法
1 // 插入排序的写法:即使不需要哨兵,也可以写的很流畅。 2 int* insertionSort(int* A, int n) { 3 // write code here 4 for(int i=1;i<n;i++){ 5 int j=i-1,tmp=A[i]; 6 while(j>=0 && A[j]>tmp){ 7 swap(A[j],A[j+1]); 8 j--; //在while循环中一定注意变量控制 9 } 10 } 11 return A; 12 }
1 // 归并排序的不错写法 2 void merge(int*,int,int,int); 3 4 // mergeSort:递归; 5 // 提供参数[left,right) 6 void mergeSort(int* A,int left,int right) { 7 if(right-left>1){ 8 mergeSort(A,left,(left+right+1)/2); 9 mergeSort(A,(left+right+1)/2,right); // (left+right+1)/2 : 一定要+1; (因为整数除法的机制) 10 merge(A,left,(left+right+1)/2,right); 11 } 12 } 13 14 // [left,mid) , [mid,right); 15 // 对于[left,right)的二分有序段进行整合. 倒序进行插入 16 // 学会使用标准库!(vector!!!) 17 void merge(int* A,int left,int mid,int right){ 18 vector<int> p; 19 copy(A+mid,A+right,back_inserter(p)); // 一定要使用插入迭代器,另外对于vector只能使用back_inserter,不能使用front_inserter,因为vector不支持push_front. 20 21 // 倒序插入 22 int i=mid-1,j=p.size()-1,index=right-1; 23 while(i>=left && j>=0){ 24 if(A[i]<=p[j]){ 25 A[index]=p[j--]; 26 } 27 else{ 28 A[index]=A[i--]; 29 } 30 index--; 31 } 32 }
1 // 快排:思想到位 (关键:right所在的位置是最终位置) 2 // [left,right) 3 void QuickSort(int *A,int left,int right){ 4 if(right-left>1){ 5 int i=left+1,j=right-1; 6 while(i<=j){ 7 while(i<=j && A[i]<=A[left]){ 8 i++; 9 } 10 while(i<=j && A[j]>=A[left]){ 11 j--; 12 } 13 if(i>j){ 14 swap(A[left],A[j]); 15 break; 16 } 17 swap(A[i],A[j]); 18 } 19 QuickSort(A,left,j); 20 QuickSort(A,j+1,right); 21 } 22 }