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 **************/