c++ 快速排序算法【过程图解】

yizhihongxing

C++ 快速排序算法【过程图解】

快速排序是一种常用的排序算法,其基本原理是通过分治的思想将待排序序列分成若干子序列,使得每个子序列都是有序的。具体实现时,首先选择一定的元素作为基准值,然后将比基准值小的元素全部放在基准值的左边,比基准值大的元素全部放在基准值的右边,这样就将序列分成了分别包含较小元素和较大元素的两个子序列。然后,递归地对子序列进行排序,最终将整个序列排序完成。

下面是使用 C++ 语言实现快速排序的代码示例:

#include <iostream>
#include <algorithm>
using namespace std;

// 定义交换函数
void swap(int& a, int& b) {
    int tmp = a;
    a = b;
    b = tmp;
}

// 定义快速排序函数
void quick_sort(int A[], int start, int end) {
    if (start >= end) {
        return; // 递归终止条件
    }
    int pivot = A[start]; // 定义基准值
    int left = start + 1; // 定义左指针
    int right = end; // 定义右指针
    while (left <= right) {
        if (A[left] < pivot) {
            left++; // 如果左指针中的元素小于基准值,向右移动左指针
        } else if (A[right] > pivot) {
            right--; // 如果右指针中的元素大于基准值,向左移动右指针
        } else {
            swap(A[left], A[right]); // 如果左指针中的元素大于基准值且右指针中的元素小于基准值,交换两个指针所指向的元素
            left++; // 继续向右移动左指针
            right--; // 继续向左移动右指针
        }
    }
    swap(A[start], A[right]); // 将基准值和右指针所指向的元素交换
    quick_sort(A, start, right - 1); // 递归排序左子序列
    quick_sort(A, right + 1, end); // 递归排序右子序列
}

int main() {
    int A[] = {3, 1, 4, 7, 2, 5, 8, 6};
    int n = sizeof(A) / sizeof(int);
    quick_sort(A, 0, n - 1);
    for (int i = 0; i < n; i++) {
        cout << A[i] << " ";
    }
    cout << endl;
    return 0;
}

上面的代码中,首先定义了一个 swap() 函数来实现交换操作。然后定义了 quick_sort() 函数,该函数的参数包括待排序数组 A[]、起始位置 start 和结束位置 end。在 quick_sort() 函数中,首先判断递归是否应当结束,如果起始位置已经大于等于结束位置,则说明该子序列已经有序,递归终止;否则,选择序列中的第一个元素作为基准值 pivot,然后定义两个指针 leftright,分别指向序列的首尾元素,开始进行元素交换。当 left 指针所指向的元素小于基准值时,left 指针向右移动;当 right 指针所指向的元素大于基准值时,right 指针向左移动;当 leftright 指针分别指向的元素大小关系和基准值大小关系不同时,交换两个元素。最后将基准值和 right 指针所指向的元素交换,然后递归对子序列进行排序。

下面分别对两个示例说明:

示例一

对数组 {3, 1, 4, 7, 2, 5, 8, 6} 进行快速排序,过程如下:

  1. 选择 3 作为基准值,指针 left 指向 1,指针 right 指向 6。
  2. 从左向右找到第一个大于等于基准值 3 的元素 7 和 left 指针交换位置,此时序列为 {7, 1, 4, 3, 2, 5, 8, 6},指针 right 指向 5。
  3. 从右向左找到第一个小于等于基准值 3 的元素 2 和 right 指针交换位置,此时序列为 {7, 1, 4, 2, 3, 5, 8, 6},指针 left 指向 4。
  4. 继续重复步骤 2 和 3,直到 left 和 right 指针相遇为止,此时序列为 {2, 1, 3, 4, 7, 5, 8, 6},并且 left 和 right 指针重合的位置是 3。
  5. 将基准值 3 和位置 3 上的元素交换位置,此时序列为 {2, 1, 3, 4, 7, 5, 8, 6}。
  6. 对左子序列 {2, 1}、右子序列 {4, 7, 5, 8, 6} 分别重复上述步骤,直到整个序列有序。

最终,排序后的序列为 {1, 2, 3, 4, 5, 6, 7, 8}。

示例二

对数组 {3, 2, 1, 4, 5} 进行快速排序,过程如下:

  1. 选择 3 作为基准值,指针 left 指向 2,指针 right 指向 4。
  2. 从左向右找到第一个大于等于基准值 3 的元素 4。
  3. 从右向左找到第一个小于等于基准值 3 的元素 2。
  4. 交换元素 4 和 2 的位置,此时序列为 {2, 4, 1, 3, 5}。
  5. 继续重复步骤 2 和 3,直到 left 和 right 指针相遇为止。
  6. 将基准值 3 和位置 2 上的元素交换位置,此时序列为 {2, 3, 1, 4, 5}。
  7. 对左子序列 {2, 1}、右子序列 {4, 5} 分别重复上述步骤,直到整个序列有序。

最终,排序后的序列为 {1, 2, 3, 4, 5}。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c++ 快速排序算法【过程图解】 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • javascript冒泡排序小结

    JavaScript冒泡排序小结 什么是冒泡排序 冒泡排序是一种经典排序算法,它重复地走访过要排序的数列,每次比较相邻的两个元素,如果顺序不对则交换它们,直到没有需要交换的元素为止。 冒泡排序的步骤 冒泡排序的主要步骤如下: 比较相邻的元素。如果第一个比第二个大,就交换它们; 对每一对相邻的元素做同样的工作,从开始的第一对到结尾的最后一对,这样在最后的元素应…

    算法与数据结构 2023年5月19日
    00
  • c语言5个常用的排序算法实例代码

    C语言5个常用的排序算法实例代码 本文旨在讲解C语言中常用的5种排序算法,包括冒泡排序、选择排序、插入排序、快速排序和归并排序。以下将逐一介绍它们的实现过程,并提供示例代码。 冒泡排序(Bubble Sort) 算法思想:冒泡排序是一种简单的排序算法,它会首先比较相邻的元素,如果它们的顺序不正确,就交换它们的位置。这样一遍比较下来,最后一个元素就已经是最大的…

    算法与数据结构 2023年5月19日
    00
  • C语言超详细梳理排序算法的使用

    C语言超详细梳理排序算法的使用 概述 本攻略旨在介绍C语言中常见的排序算法的实现与使用方法。排序算法是计算机科学中非常重要的一部分,它们可以对大量的数据进行快速的排序,是各类计算机系统与应用中的重要组成部分,对于编写具有高效性能的代码具有非常重要的作用。对于初学者,学习排序算法不仅可以提高编程能力,同时也是学习算法与数据结构的入门之路。 本文介绍以下常见的排…

    算法与数据结构 2023年5月19日
    00
  • js算法中的排序、数组去重详细概述

    JS算法中的排序、数组去重详细概述 排序算法 在JavaScript中,常用的排序算法有冒泡排序、插入排序、选择排序、快速排序等。下面将分别对他们进行介绍。 冒泡排序 冒泡排序是一种稳定的排序算法,它的基本思想是从左到右依次比较相邻两个元素的大小,并且将较大的元素向右移动,较小的元素向左移动。重复这个过程直到没有任何元素需要移动为止。 下面是冒泡排序的Jav…

    算法与数据结构 2023年5月19日
    00
  • JS前端面试必备——基本排序算法原理与实现方法详解【插入/选择/归并/冒泡/快速排序】

    JS前端面试必备——基本排序算法原理与实现方法详解 在前端面试中,算法是一个必考的考点,掌握一些基本的排序算法对于一个前端工程师来说是非常重要的。 排序算法的分类 排序算法可以按照许多不同的标准进行分类: 平均时间复杂度 空间复杂度 稳定性 内部排序和外部排序 在这篇文章中,我们将按照时间复杂度从小到大的顺序介绍以下五个基本的排序算法:插入排序、选择排序、归…

    算法与数据结构 2023年5月19日
    00
  • 大数据情况下桶排序算法的运用与C++代码实现示例

    桶排序算法是一种基于计数的排序算法,它的主要思想是把一组数据分成多个桶,对每个桶中的数据进行排序,最后依次把每个桶中的数据合并起来,得到排序后的结果。在大数据情况下,桶排序算法可以大幅减少排序时间,因为它可以快速地将数据分成多个桶,进行并行排序,最终合并起来。 以下是桶排序算法在大数据情况下的运用及C++代码示例: 算法思路 先确定桶的数量,也就是需要将数据…

    算法与数据结构 2023年5月19日
    00
  • JS中数组随机排序实现方法(原地算法sort/shuffle算法)

    JS中实现数组随机排序有两种常见方法:原地随机排序算法和使用shuffle算法。 原地随机排序算法 原地随机排序算法(in-place shuffle algorithm)是将数组中元素随机地乱序,同时保持每个元素之间的相对位置不变。算法的时间复杂度是O(n),空间复杂度是O(1),因为所有的操作都是在原数组上进行。 实现步骤 获取数组长度 从数组的最后一个…

    算法与数据结构 2023年5月19日
    00
  • php实现归并排序算法的方法详解

    PHP实现归并排序算法的方法详解 归并排序算法简介 归并排序是一种使用分治法思想的高效稳定排序算法。其基本思想是将待排序的序列拆分成若干个子序列,对每个子序列进行排序,然后将排序后的子序列合并成一个大的有序序列。 归并排序算法的复杂度为O(nlogn),适用于各种数据规模的排序。 归并排序算法步骤 将序列递归拆分成若干个子序列。 对每个子序列进行递归排序。 …

    算法与数据结构 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部