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

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实现经典排序算法之冒泡排序 什么是冒泡排序? 冒泡排序是一种简单的排序算法,从序列左侧开始比较两个相邻的元素,如果顺序不对就交换位置,直到序列末尾,这样一次遍历后,序列最后一个元素就是当前序列最大值。然后对剩余序列重复上述过程,直到整个序列有序。 算法实现 我们来看看如何用JavaScript实现冒泡排序。 function bubble…

    算法与数据结构 2023年5月19日
    00
  • Java 十大排序算法之计数排序刨析

    Java 十大排序算法之计数排序刨析 算法介绍 计数排序是一个时间复杂度为O(n+k)的非基于比较的排序算法,其中n是待排序元素的个数,k是待排序元素的范围,即待排序元素的最大值减去最小值再加1。 算法通过构建一个长度为k的计数数组来统计每个元素出现的次数,然后借助计数数组按顺序输出每个元素,就完成了排序过程。 因为计数排序是非基于比较的算法,因此可以在一定…

    算法与数据结构 2023年5月19日
    00
  • javascript中可能用得到的全部的排序算法

    Javascript中可能用得到的全部排序算法 在JavaScript中,排序算法是非常常见和重要的。因为在编写程序时,我们经常需要对数组、集合等数据结构进行排序操作。接下来,我将按照常用的一些排序算法逐一介绍。 冒泡排序(Bubble Sort) 冒泡排序是一种简单的交换排序算法。它通过相邻两个元素的比较和交换来排序。每一轮比较都会将最大的元素沉到最底部。…

    算法与数据结构 2023年5月19日
    00
  • 深入学习C语言中常见的八大排序

    深入学习C语言中常见的八大排序 前言 排序算法是计算机科学中的基本问题之一,是计算机领域内经典且常见的算法问题之一。排序算法对于优化数据检索、数据压缩、数据库查询效率等方面都有着重要的意义。本文将为您详细讲解常见的八种排序算法的原理、时间复杂度以及应用场景,希望能够对您学习和了解排序算法提供帮助。 简介 排序算法是将一串数据按照一定的规则进行排列,排序算法可…

    算法与数据结构 2023年5月19日
    00
  • JS实现常见的查找、排序、去重算法示例

    JS实现常见的查找、排序、去重算法示例 在 JavaScript 中,常见的算法题目也非常多,其中最常见的算法大致可以分为三类,即查找、排序和去重。在这里将对这三个方面中比较常用的算法进行一一解析,以期能够帮助大家更好的理解和掌握这些算法的使用。 一、查找 1. 二分查找 在排序好的数组中查找一个值,如何快速地找到这个值呢?这时候可以使用二分查找算法。它的原…

    算法与数据结构 2023年5月19日
    00
  • java简单选择排序实例

    Java简单选择排序是一种基于比较的排序算法,其基本思想是每次从待排序数据中选取最小(或最大)的元素,放到已排序的数据的末尾,直到所有元素都被排序完成。以下是Java简单选择排序实现的完整攻略: 算法步骤 遍历待排序的数组,每次选择最小的元素。 将已排序区间的末尾与最小元素进行交换。 扫描完整个数组,排序完成。 代码示例 下面给出了Java的简单选择排序的代…

    算法与数据结构 2023年5月19日
    00
  • C++ 计数排序实例详解

    C++ 计数排序实例详解 简介 计数排序是一种稳定的排序算法,其时间复杂度为O(n + k),其中n为待排序序列的长度,k为序列中元素的取值范围。相比其他排序算法,计数排序的时间复杂度较小,但需要占用更多的内存空间。计数排序在排序的元素值比较小,且元素集合密集程度比较大的场景下表现更加出色。 算法原理 计数排序的基本思想是,统计待排序序列中,每个元素出现的个…

    算法与数据结构 2023年5月19日
    00
  • 纯python实现机器学习之kNN算法示例

    首先我们需要清楚kNN算法的基本思想。kNN算法是一种基于实例的有监督学习算法,可以用于分类和回归问题。对于一个新的未标记数据,该算法会根据其与训练集中数据的距离,找到距离该点最近的k个点,然后根据这k个点的标签或者值来对该点进行分类或回归。 以下是具体实现步骤: 准备数据 kNN算法需要一个已经标记好的训练数据集。这里我们以Iris花卉数据集为例。我们先把…

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