各种排序总结(五)快速排序

 1 /*********************
 2 快排思想:
 3 1.i =L; j = R; 选取第一个数为基准数,将基准数挖出形成第一个坑a[0]。
 4 2. j—从后向前找到比基准数小的,找到后将此数挖出填入前一个坑中a[i],形成新的坑a[j]
 5 3. i++从前向后找到比基准数大的,找到后将此数挖出填入前一个坑中a[j]
 6 4. 重复执行2、3步直到i==j,将基准数填入即可
 7 ***********************/
 8 #include <iostream>
 9 
10 using namespace std;
11 
12 int Partition(int * arr, int l, int r)
13 {
14     int pivot = arr[l];
15     while(l < r)
16     {
17         while((arr[r] > pivot) && (l < r))
18             r--;
19         if(l < r)
20         {
21             arr[l] = arr[r];
22             l++;
23         }
24         while((arr[l] < pivot) && (l < r))
25             l++;
26         if(l < r)
27         {
28             arr[r] = arr[l];
29             r--;
30         }
31     }
32     arr[l] = pivot;
33     return l;
34 }
35 
36 void QuickSort(int* arr, int l, int r)
37 {
38     if(l >= r) return;
39     else
40     {
41         int pivot_index = Partition(arr,l,r);
42         QuickSort(arr,l,pivot_index-1);
43         QuickSort(arr,pivot_index+1,r);
44     }
45 }
46 
47 
48 int main()
49 {
50     int * arr;
51     int n;
52     cout<<"Input the arr length:"<<endl;
53     cin>>n;
54     arr = new int[n];
55     cout<<"Input the arr elements:"<<endl;
56     for(int i=0;i<n;i++)
57     {
58         cin>>arr[i];
59     }
60     QuickSort(arr,0,n-1);
61     cout<<"The outcome:"<<endl;
62     for(int i=0;i<n;i++)
63         cout<<arr[i]<<endl;
64     return 0;
65 }
66 
67 /************
68 不稳定
69 比较次数比移动次数多很多。
70 最差情况:待排序关键字已有序时
71           每次分割都将记录全部分到一个子序列中,而另一个子序列为空。
72           这种情况相当于二叉树每个结点只有左结点(或一直只有右结点)。
73           时间复杂度为O(n^2)。
74 最好情况:待排序关键字随机分布时
75           每次分割都很平均,恰好记录分成两个长度相等的子序列。
76           这种情况相当于平衡二叉树。
77           时间复杂度O(nlogn)。
78 平均情况:轴值将数组分成长度为0和n-1,或者1和n-2,或者...等各种情况是等概率的。
79           时间复杂度为O(nlogn)。
80 最差空间代价:O(n)
81 平均空间代价:O(logn)
82 综上:当待排序元素随机分布时,快排时间最短。
83 **************/

 

posted on 2013-09-11 15:41  CnZyy  阅读(252)  评论(0编辑  收藏  举报

导航