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日

相关文章

  • 解析左右值无限分类的实现算法

    下面为你详细讲解“解析左右值无限分类的实现算法”的完整攻略: 1. 了解左右值无限分类 左右值无限分类,也称为嵌套集合模型,是一种常见的无限分类方式。在该模型中,每个分类都有一个左值和右值,通过比较左右值大小,可以判断出一个分类是否是另一个分类的子分类或者父分类。支持多层级分类,可以无限嵌套。 2. 左右值无限分类的实现算法 左右值无限分类的实现算法分为两步…

    算法与数据结构 2023年5月19日
    00
  • C++九种排序具体实现代码

    针对“C++九种排序具体实现代码”的攻略,我将从以下几个方面进行详细讲解: 九种排序算法介绍 排序算法实现代码示例 一些注意事项 九种排序算法介绍 在介绍具体代码实现之前,我们先来了解一下九种排序算法的特点。 冒泡排序(Bubble Sort):通过不断交换相邻的两个元素,将大的元素逐渐往后移动,最后得到有序序列。 快速排序(Quick Sort):通过设定…

    算法与数据结构 2023年5月19日
    00
  • 利用JavaScript在网页实现八数码启发式A*算法动画效果

    下面是利用JavaScript在网页实现八数码启发式A*算法动画效果的完整攻略: 简介 八数码问题是指在一个33的方格上,放置了1~8这八个数字,其中有一个空格可以移动,初态和目标态之间的变换最少需要几步。而启发式A算法是一种针对图形和网络中的路径规划问题的搜索算法。 利用JavaScript实现八数码启发式A*算法动画效果,可以帮助用户在屏幕上直观地看到计…

    算法与数据结构 2023年5月19日
    00
  • 如何用C++实现A*寻路算法

    一、什么是A*寻路算法? A寻路算法(A search algorithm),也叫A算法,是一种启发式搜索算法,常用于求解路径规划问题。A算法结合了Dijkstra算法和启发式搜索的优点,能够在保证找到最短路径的情况下,大大降低搜索的时间和空间消耗。 二、A*寻路算法的原理 1.最短路径 在计算机科学中,最短路径问题是指两点之间的所有路径中,经过的边或节点数…

    算法与数据结构 2023年5月19日
    00
  • C语言简单实现快速排序

    C语言简单实现快速排序 什么是快速排序? 快速排序(Quicksort)是一种分治的排序算法,由Tony Hoare于1960年提出。快速排序使用两个指针i,j分别指向待排序数组的最左侧和最右侧,以一个值作为基准(pivot),一般为数组的中间值。快速排序的主要思路是将数组中小于基准值的数放到基准值左边,将大于基准值的数放到右边。然后通过递归的方式,对左右两…

    算法与数据结构 2023年5月19日
    00
  • c++数组排序的5种方法实例代码

    C++ 数组排序的 5 种方法实例代码 本篇文章介绍了使用 C++ 实现数组排序的 5 种方法,包括冒泡排序、选择排序、插入排序、希尔排序和快速排序。下面我们就分别详细阐述各种排序方法的实现。 冒泡排序 冒泡排序的基本思想是比较相邻的两个元素,如果顺序错误就交换位置。我们重复地执行这个过程,直到排序完成。示例代码如下: void BubbleSort(int…

    算法与数据结构 2023年5月19日
    00
  • 一道JS前端闭包面试题解析

    下面我来为你讲解一道 JS 前端闭包面试题的完整攻略。 面试题 下面是面试题的题目与内容: for (var i = 0; i < 5; i++) { setTimeout(function() { console.log(i); }, 0); } 要求输出 0, 1, 2, 3, 4,但是实际上却是输出了 5, 5, 5, 5, 5。请问这是为什么?…

    算法与数据结构 2023年5月19日
    00
  • Java语言字典序排序算法解析及代码示例

    Java语言字典序排序算法解析及代码示例 概述 字典序排序是一种常见的字符串排序算法,其可用于字符串编程中的许多场景,例如:搜索引擎中输入提示的联想;电商网站的商品搜索结果排列;信息化项目中的数据对比等。 本文将介绍Java语言中使用字典序排序的方法以及实现代码,并包含两个代码示例以帮助读者更好地理解。 基本思想 字典序排序的基本思想是将需要排序的字符串按照…

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