快速排序的基本思想(图文详解)

这篇具有很好参考价值的文章主要介绍了快速排序的基本思想(图文详解)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

快速排序算法通过多次比较和交换来实现排序,其排序流程如下:
(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。
(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于分界值,而右边部分中各元素都大于或等于分界值。

(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。

(4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。

此解释源自百度百科

接下来我一句一句的解释这四句话

一、(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。

快速排序法的基本思路,数据结构,排序算法,算法,数据结构

我们以这几个数字为例。我们要选定一个分界值(这个过程非常简单,可以采取三数取中的方法)这篇博客的重心在于介绍快排的思想,我们就简单的以第一个数字(6)为分界值吧。
快速排序法的基本思路,数据结构,排序算法,算法,数据结构

二、(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于分界值,而右边部分中各元素都大于或等于分界值。

我们接下来要做的是将数组中大于等于6的数据集中到数组右边,小于分解值的数据集中到数组左边,那么怎么实现这个过程呢?

快速排序法的基本思路,数据结构,排序算法,算法,数据结构
我们会设置两个指针,分别指向数组的左边和数组的右边。然后将两个指针不断的向中间逼近。直到它两吻合。
对于j指针而言,它要不断向左走。它的目标是找到比6小的数据,如果找到了的话就停下来。
对于指针i而言,它要不断向右走,它的目标是找到比6大的数据,如果找到的话就停下来。
然后交换i指针指向的数据和j指针指向的数据。
快速排序法的基本思路,数据结构,排序算法,算法,数据结构

快速排序法的基本思路,数据结构,排序算法,算法,数据结构
到这里,第一次交换就结束了,但是任务仍未结束,我们仍然无法确定两个指针中的数据满足条件。i继续向右走,j继续向左走
快速排序法的基本思路,数据结构,排序算法,算法,数据结构

在这,i继续指向了大于6的数,重复上述操作。
快速排序法的基本思路,数据结构,排序算法,算法,数据结构
交换完成后,j继续往左走,i继续往右走

快速排序法的基本思路,数据结构,排序算法,算法,数据结构
此时出现了一种状况:j指向了小于分界值的数据,但i没有。但是i与j已经相遇了。此时它们相遇点的数据必定是小于分界值的。因为我们要让j先走,j遇到小于分界值的数据就会停下来。j走完才会让i走。最终相遇时就一定是小于分界值的数据。这时,我们将分界值的数据与相遇点的数据交换。
快速排序法的基本思路,数据结构,排序算法,算法,数据结构
此时,我们就完成了单趟排序,即比分界值小的值都在它的左边,比分界值大的值都在它的右边。同时我们可以认为,分界值已经在它正确的位置了。

三、(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。

快速排序法的基本思路,数据结构,排序算法,算法,数据结构
到这里,我们对上一步分界值的左边一部分数据进行与第二步类似的处理。
一、选出分界值。
二、将小于分界值的数据放到左边,大于分界值的数据放到右边。

四、(4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。

五、总结

在上述过程中,有几个需要注意的点。
1.必须要让j先走。这是为了确保i和j相遇时指向的一定是比分界值小的数。
2.单趟排序之后,分界值就到了它应该到的位置(这句话的意思理解一下就是:这个分界值已经到了终点了。后续也不会再管它了)文章来源地址https://www.toymoban.com/news/detail-789450.html

六、代码实现

void Quick_Sort(int *arr, int begin, int end){
    if(begin > end)
        return;
    int tmp = arr[begin];
    int i = begin;
    int j = end;
    while(i != j){
        while(arr[j] >= tmp && j > i)
            j--;
        while(arr[i] <= tmp && j > i)
            i++;
        if(j > i){
            int t = arr[i];
            arr[i] = arr[j];
            arr[j] = t;
        }
    }
    arr[begin] = arr[i];
    arr[i] = tmp;
    Quick_Sort(arr, begin, i-1);
    Quick_Sort(arr, i+1, end);
}

到了这里,关于快速排序的基本思想(图文详解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】排序算法复杂度 及 稳定性分析 【图文详解】

    前面给大家讲述了各大排序算法的原理、思路以及实现步骤、代码码源,下面让我们来对比一下各大排序之间的算法复杂度以及稳定性分析优劣,加深我们对于各排序算法的理解,帮助我们以后能更快的在具体场景下选择出最适的排序算法。 【数据结构】冒泡排序 (码源实

    2024年02月05日
    浏览(39)
  • c语言快速排序(霍尔法、挖坑法、双指针法)图文详解

      快速排序是一种非常常用的排序方法,它在1962由C. A. R. Hoare(霍尔)提的一种二叉树结构的交换排序方法,故因此它又被称为 霍尔划分 ,它基于分治的思想,所以整体思路是递归进行的。 1.先选取一个key,关于key值的选取,一般是选数组第一个元素,数组中间元素,数组

    2024年02月02日
    浏览(28)
  • 【数据结构】 七大排序详解(贰)——冒泡排序、快速排序、归并排序

    ==冒泡排序(Bubble Sort)==也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会

    2024年02月09日
    浏览(42)
  • 【数据结构】快速排序详解

    目录 一、基本介绍 二、快排的实现 1. 调试环境 2.快排的单趟排序 (1)Hoare版本 (2)挖坑法 (3)前后指针法 2.递归过程 三、快排的优化 1. 优化取key方式,防止栈溢出 2. 小区间优化 四、快排的非递归方式         排序算法是日常使用最频繁的一个算法,生活中也很常

    2024年02月09日
    浏览(33)
  • 【数据结构】详解七大排序算法(直接插入排序、希尔排序、直接选择排序、堆排序、冒泡排序、快速排序)

    1、基本思想    把待排序的数按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所以的记录插入完为止,得到一个新的有序序列。    实际中我们玩扑克牌时,就用到了插入排序的思想 基本步骤:    当插入第i个元素时,前面的arr[0]、arr[2]…arr

    2024年02月04日
    浏览(51)
  • 【快速排序算法思想及其应用】

    本文主要介绍Java中快速排序(Quick Sort)算法的基本原理、实现方式以及使用场景。快速排序是一种高效的排序算法,通过选取一个基准元素并将待排序序列划分为小于基准元素和大于基准元素的两部分来实现排序。本文将深入剖析快速排序的思想及其在实际应用中的价值。

    2024年02月07日
    浏览(32)
  • 快速排序思想

    快速排序是指通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序。整个排序过程可以递归进行,以此达到整个数据变成有序序列。 代码实现:

    2024年02月07日
    浏览(28)
  • 数据结构-堆结构与堆排序思想

    heap.h #pragma once #include stdio.h #include stdbool.h #include assert.h #include errno.h #include stdlib.h //数组实现堆 typedef int HPDataType; typedef struct Heap {     HPDataType* a;     int size;     int capacity; }HP; void HeapInit(HP* php);//初始化堆 void HeapDestroy(HP* php);//销毁堆 void HeapPush(HP* php, HPDataType x);//插入数

    2024年02月16日
    浏览(25)
  • 插入,选择,堆,快速排序算法思想与复杂度

    目录 插入排序 思想 算法步骤 代码 复杂度 选择排序 思想 算法步骤 代码 复杂度 堆排序  思想 算法步骤 代码 复杂度  快速排序  思想 算法步骤 代码 复杂度 稳定性 插入排序是一种简单直观的排序算法。它的工作原理是将数组分为 已排序 和 未排序 两部分,然后依次将未

    2024年02月15日
    浏览(27)
  • 【数据结构】深入浅出理解快速排序背后的原理 以及 版本优化【万字详解】(C语言实现)

    快速排序是 Hoare 于1962年提出的一种 二叉树结构 的 交换排序 方法。 任取待排序元素序列中的 某元素作为基准值 ,按照该排序码将待排序集合 分割成两子序列 , 左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值 ,然后最左右子序列重复该过程,直到所

    2024年02月05日
    浏览(90)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包