8.快速排序

 1 #include "pch.h"
 2 #include <iostream>
 3 // 该算法的思想是假设待排序序列设置为这样: pivot|L||R||比较序列|
 4 // 每次pivot和比较序列(一般我们设数组首元素为pivot,则为数组第二个元素开始往后的序列)
 5 // 我们记录了L的末元素end,这样每当我们需要将L扩增时,不必移动R,而是将R首元素(++end)与比较序列的元素交换
 6 int Partition(int *arr,int lo,int hi) {
 7     int pivot = arr[lo]; //实际上pivot应当具有随机性,使用rand()可随机设置序列中的元素作为pivot
 8     int end = lo;  //指示左序列的最后一个元素的秩
 9     for (int k = lo + 1; k <= hi; k++) {    //省略else分支
10         if (arr[k] < pivot)                 //如果中轴值比比较序列大,L右移,否则只需显式K++(R扩增)
11             std::swap(arr[++end], arr[k]);
12     }
13     std::swap(arr[lo], arr[end]);           //记住,中轴值一开始位置从未变过,最后需要做一次交换
14     return end;
15 }
16 void quickSort(int *arr, int lo, int hi) {
17     if (lo<hi){
18         int mid = Partition(arr, lo, hi);
19         quickSort(arr,lo, mid);
20         quickSort(arr, mid + 1, hi);
21     }
22 }
23 int main() {
24     int a[8] = { 4,2,3,7,6,9,8,5 };
25     quickSort(a, 0,7);
26     for (int k = 0; k < 8; k++) {
27         std::cout << a[k] << " ";
28     }
29 }

 

posted @ 2019-11-12 15:36  Royzzzzz  阅读(118)  评论(0编辑  收藏  举报