【C++ | 排序算法】:快速排序

756 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第22天,点击查看活动详情

1、写在前面

大家好,今天文章的内容是:

  • 快速排序

2、内容

介绍

快速排序(Quick Sort,也称分区交换排序)是对冒泡排序算法的一种改进。在冒泡排序中,记录的比较和移动是在相邻的位置进行的,记录每次交换只能消除一个逆序,因而总的比较和移动次数较多。在快速排序中,通过分区间的一次交换能消除多个逆序。实际上,快速排序名副其实,它是目前最快的内部排序算法,被评为“20世纪十大算法”。

步骤

  1. 首先,设定一个分界值pivot
  2. 接着将大于分界值的数据划分到分界值的右边,将小于或等于分界值的数据集中到分界值的左边。
  3. 就这样,通过该分界值pivot可以将数组分成左右两部分。
  4. 然后,对于左边和右边的数据可以再进行快速排序,比如对于左侧数据,再取一个分界值,将左侧数据再分为两部分,右侧数据也做同样处理;
  5. 重复以上过程,直到子序列只有一个记录为止。

可以发现,快速排序是一个递归定义,也可以认为是基于分治法的排序(快速、归并)。

示意

image.png

代码

快速排序示意如下:

#include <iostream>
using namespace std;


// 用首元素将待排序的序列划分为左右两个部分 
int partition(int A[], int low, int high) {
    // 将序列的首元素视为分界值(枢轴)
    int pivot = A[low];
    // 用low和high搜索枢轴的最终位置 
    while(low < high) {
        while(low<high && A[high]>=pivot) --high;
        A[low] = A[high];
        while(low<high && A[low]<=pivot) ++low;
        A[high] = A[low];
    }
    A[low] = pivot;  // 枢轴元素存放在最终位置 
    return low;      // 返回存放枢轴的最终位置 
}

// 递归实现 
void QuickSort(int A[], int low, int high) {
    if(low<high) {
        int pivotPos = partition(A, low, high); // 划分 
        QuickSort(A, low, pivotPos-1);	// 划分左子表 
        QuickSort(A, pivotPos+1, high);	// 划分右子表
    }
}

// 主函数
int main() {
    int arr[9] = {90, 20, 50, 40, 80, 10, 70, 30, 60}; 
    QuickSort(arr, 0, 8);
    for(int i : arr) {
        cout << " " << i;
    }
    return 0;
}

3、写在最后

好了,文章的内容就到这里,感谢观看。