排序之快速排序--C++

25 阅读2分钟

步骤

步骤操作描述
1选择基准值从数组中选择一个元素作为基准值(例如,最后一个元素)
2初始化指针设置两个指针,一个指向基准值的左侧,另一个指向右侧
3遍历和比较从左向右遍历,找到第一个大于基准值的元素,并从右向左找到第一个小于基准值的元素
4交换元素交换这两个找到的元素
5移动基准值将基准值与右侧指针所指的元素交换位置
6重复步骤3-5继续重复步骤3-5,直到左右指针相遇
7递归排序对基准值左侧和右侧的子数组递归执行快速排序

举例

假设当前的待排序的序列为 R[low,hight] , 其中 low<=hight。同时选取首元素为基准元素。

步骤一:选取首元素的第一个元素作为基准元素 pivot=R[low] ,i=low ,j=hight。

步骤二:从右向左扫描,找到小于等于 pivot 的数,如果找到,R[i] 和 R[j] 交换 ,i++。

步骤三:从左向右扫描,找到大于 pivot 的数,如果找到,R[i] 和 R[j] 交换,j--。

步骤四:重复 步骤二~步骤三,直到 j 与 i 的指针重合 返回位置 mid=i ,该位置的数正好是 pivot 元素。

至此换成一趟排序,此时以 mid 为界线,将数据分割为两个子序列,左侧子序列都比 pivot 数小,右侧子序列都比 pivot 数大,然后再分别对这两个子序列进行快速排序。

代码

#include <bits/stdc++.h>
using namespace std;

int a[1000];

int part(int low, int high) {
    int i = low, j = high, pivot = a[low];
    while (i < j) {
        while (i < j && a[j] > pivot) { // 从右往左找,找到一个比基准小于等于的数
            j--;
        }
        if (i < j) {
            swap(a[i++], a[j]);
        }
        while (i < j && a[i] < pivot) {   //从左忘右边走,找到一个比基准大的数 
            i++;
        }
        if (i < j) {
            swap(a[i], a[j--]);
        }
    }
    return i;
}

void quicksort(int low, int high) {
    int mid;
    if (low < high) {
        mid = part(low, high);   // 返回基准元素的位置
        quicksort(low, mid - 1);
        quicksort(mid + 1, high);
    }
}

int main() {
    int n;
    cout << "请输入个数:";
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    quicksort(0, n - 1);
    cout << "排序后:" << endl;
    for (int i = 0; i < n; i++) {
        cout << a[i] << " ";
    }
    cout << endl;
    return 0;
}