算法学习记录——快速排序(Quick sort)

        本文章仅用于学习记录。

一、首先介绍快速排序的原理

        

        快速排序(Quick Sort)是一种分治法(Divide and Conquer)的排序算法。它通过选择一个基准元素,将数组划分成左右两个子数组,其中左边子数组的元素都小于等于基准元素,右边子数组的元素都大于基准元素。然后递归地对左右子数组进行排序,最终得到一个有序数组。

        快速排序的核心思想可以总结为以下步骤:

  1. 选择一个基准元素,通常选择数组的最后一个元素。
  2. 设定两个指针,一个指向数组的起始位置,一个指向数组的末尾位置。
  3. 从左指针开始向右遍历数组,直到找到第一个大于基准元素的元素。
  4. 从右指针开始向左遍历数组,直到找到第一个小于基准元素的元素。
  5. 若左指针小于等于右指针,则交换左右指针所指向的元素。
  6. 重复步骤3~5,直到左指针大于右指针。
  7. 将基准元素与左指针所指向的元素进行交换,此时基准元素左边的元素都小于等于它,右边的元素都大于它。
  8. 递归地对左右子数组进行快速排序。

二、示例

        下面我将举例说明,假设有这样一个整数序列:[8, 3, 1, 5, 9, 2, 7, 6]

        首先,选择最后一个元素作为基准元素,即数字6。接下来,我们使用两个指针分别从数组的起始位置和末尾位置开始遍历。左指针从第一个元素8开始,右指针从最后一个元素6开始。左指针先向右移动,直到找到第一个大于基准元素6的元素。在这个例子中,左指针停在了数字9上,右指针保持不动。然后,右指针开始向左移动,直到找到第一个小于基准元素6的元素。在这个例子中,右指针停在了数字2上。由于左指针小于等于右指针,我们交换左右指针所指向的元素。此时,数组变为:[8, 3, 1, 5, 2, 9, 7, 6] 重复以上步骤一直到左指针大于右指针。最终,这个数组被划分为两个数组: [8, 3, 1, 5, 2][9, 7, 6],然后用同样的方式递归的对这两个数组进行同样的操作。最终可以得到结果[ 1, 2, 3, 5, 6, 7, 8, 9]

三、实现:

#include <iostream>
using namespace std;

// 交换数组中两个元素的位置
void swap(int& a, int& b) {
    int temp = a;
    a = b;
    b = temp;
}

// 寻找基准元素的正确位置,并返回该位置的下标
int partition(int arr[], int low, int high) {
    int pivot = arr[high]; // 选择最后一个元素作为基准元素
    int i = low - 1; // i指向小于基准元素的最后一个元素

    for (int j = low; j < high; j++) {
        if (arr[j] < pivot) {
            i++;
            swap(arr[i], arr[j]);
        }
    }

    swap(arr[i + 1], arr[high]); // 将基准元素放到正确的位置上
    return i + 1;
}

// 快速排序函数
void quickSort(int arr[], int low, int high) {
    if (low < high) {
        int pivotIndex = partition(arr, low, high); // 划分并获取基准元素的位置
        quickSort(arr, low, pivotIndex - 1); // 对左子数组进行排序
        quickSort(arr, pivotIndex + 1, high); // 对右子数组进行排序
    }
}

// 输出数组元素
void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        cout << arr[i] << " ";
    }
    cout << endl;
}

int main() {
    int arr[] = { 8, 3, 1, 5, 9, 2, 7, 6 };
    int size = sizeof(arr) / sizeof(arr[0]);

    cout << "Original array: ";
    printArray(arr, size);

    quickSort(arr, 0, size - 1);

    cout << "Sorted array: ";
    printArray(arr, size);

    return 0;
}

四、总结

        快速排序是一种高效的排序算法,它通过分治法的思想将数组不断划分并排序,最终得到一个有序数组。它的平均时间复杂度为O(nlogn),常被用作排序大型数据集的首选算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值