【Sort】QuickSort
快速排序,平均运行时间O(N log N),最坏运行时间O(N^2)。
我觉得先看Python版的快排算法(http://www.cnblogs.com/fcyworld/p/6160558.html)比较容易理解。
整体思路:
首先从数组中选出一个值pivot,然后依据这个值pivot,把数组分成大小两部分,然后再分别对这两部
分利用快排。
具体细节:
1.在具体的实现中,因为pivot的选择会对数组的划分产生很大的影响,若划分的不均衡,严重影响排序效率。
为了尽可能消除这种影响,同时取数组中的索引为0,n-1,和中值中的中间值作为pivot。产生pivot的时候,0,n-1
位置上的值已经满足pivot的要求,所以排序时候不需要再考虑,所以把pivot的值保存再n-2位置上。
2.为了把数组划分为两部分,利用双指针i,j。i从前往后掠过小于pivot的值,j从后往前掠过大于pivot的
值,当i,j停止的时候,如果i<j,交换i,j所指位置上的值,否则break;
3.在小的数组中(数组的大小<cutoff),快排的效率并不高,所以小数组时候利用插入排序
1 void quicksort(int *nums,int n) 2 { 3 qs(nums,0,n-1); 4 } 5 void qs(int*nums,int left,int right) 6 { 7 int pv; 8 int i,j; 9 int cutoff=10; 10 if(left+cutoff<=right) 11 { 12 pv=mid3(nums,left,right); 13 i=left; 14 j=right-1; 15 while(1) 16 { 17 while(nums[++i]<pv); 18 while(nums[--j]>pv); 19 if(i<j) 20 swap(nums[i],nums[j]); 21 else 22 break; 23 } 24 swap(nums[i],nums[right-1]); 25 qs(nums,left,i); 26 qs(nums,i+1,right); 27 } 28 else 29 intersort(nums+left,right-left+1); 30 } 31 int mid3(int *nums,int left,int right) 32 { 33 int center=(left+right)/2; 34 if(nums[left]>nums[center]) 35 swap(nums[left],nums[center]); 36 if(nums[left]>nums[right]) 37 swap(nums[left],nums[right]); 38 if(nums[center]>nums[right]) 39 swap(nums[center],nums[right]); 40 swap(nums[center],nums[right-1]); 41 return nums[right-1]; 42 } 43 void swap(int &m,int &n) 44 { 45 m^=n; 46 n^=m; 47 m^=n; 48 } 49 void intersort(int *nums,int n) 50 { 51 int i,j; 52 int tmp; 53 for(i=1;i<n;i++) 54 { 55 tmp=nums[i]; 56 for(j=i;j>0&&tmp<nums[j-1];j--) 57 nums[j]=nums[j-1]; 58 nums[j]=tmp; 59 } 60 }