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