【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 }

 

posted @ 2016-12-13 23:54  wilderness  阅读(256)  评论(0编辑  收藏  举报