快速排序,看了解释还是不会,求通俗点的

如题所述

快速排序简单的说就是选择一个基准,将比起大的数放在一边,小的数放到另一边。对这个数的两边再递归上述方法。

如本题

66  13  51  76  81  26  57  69  23,以66为基准,升序排序的话,比66小的放左边,比66大的放右边, 类似这种情况  13  。。。   66。。。69

具体快速排序的规则一般如下:

从右边开始查找比66小的数,找到的时候先等一下,再从左边开始找比66大的数,将这两个数借助66互换一下位置,继续这个过程直到两次查找过程碰头。

例子中:

66  13  51  76  81  26  57  69  23

从右边找到23比66小,互换

23  13  51  76  81  26  57  69  66

从左边找到76比66大,互换

23  13  51  66  81  26  57  69  76

继续从右边找到57比66小,互换

23  13  51  57  81  26  66  69  76

从左边查找,81比66大,互换

23  13  51  57  66  26  81  69  76

从右边开始查找26比66小,互换

23  13  51  57  26  66  81  69  76

从左边开始查找,发现已经跟右边查找碰头了,结束,第一堂排序结束

下面排序C语言的排序快速代码,参考一下

void sort(int *a, int left, int right)
{
    if(left >= right)/*如果左边索引大于或者等于右边的索引就代表已经整理完成一个组了*/
    {
        return ;
    }
    int i = left;
    int j = right;
    int key = a[left];
     
    while(i < j)                               /*控制在当组内寻找一遍*/
    {
        while(i < j && key <= a[j])
        /*而寻找结束的条件就是,1,找到一个小于或者大于key的数(大于或小于取决于你想升
        序还是降序)2,没有符合条件1的,并且i与j的大小没有反转*/ 
        {
            j--;/*向前寻找*/
        }
         
        a[i] = a[j];
        /*找到一个这样的数后就把它赋给前面的被拿走的i的值(如果第一次循环且key是
        a[left],那么就是给key)*/
         
        while(i < j && key >= a[i])
        /*这是i在当组内向前寻找,同上,不过注意与key的大小关系停止循环和上面相反,
        因为排序思想是把数往两边扔,所以左右两边的数大小与key的关系相反*/
        {
            i++;
        }
         
        a[j] = a[i];
    }
     
    a[i] = key;/*当在当组内找完一遍以后就把中间数key回归*/
    sort(a, left, i - 1);/*最后用同样的方式对分出来的左边的小组进行同上的做法*/
    sort(a, i + 1, right);/*用同样的方式对分出来的右边的小组进行同上的做法*/
                       /*当然最后可能会出现很多分左右,直到每一组的i = j 为止*/
}

温馨提示:内容为网友见解,仅供参考
第1个回答  2019-05-20
我刚看了一下啊哈算法中的快速排序
为什么我推演的结果都没有答案。
具体思想是,选中最左边为基准数,即66.然后设置一个哨兵从右边开始,寻找比66小的数,接着设置另一个哨兵,再从左边找比66大的书,交换双方位置,如果最后两边的哨兵相遇,就和基准数交换。下面开始推演:
例子:66 13 51 76 81 26 57 69 23
右边开始:找到了23,左边找到了76,交换:66 13 51 23 81 26 57 69 76
右边开始:找到了57,左边找到了81,交换:66 13 51 23 57 26 81 69 76
右边开始:找到了26,左边在26与哨兵相遇,交换基准数:26 13 51 23 57 66 81 69 76.
然后没有答案啊。。。。
我好迷啊。
第2个回答  2020-01-09
第3个回答  2018-03-01
没人发下答案不是A吗,我推演出来是C
第4个回答  2018-01-14

快速排序,看了解释还是不会,求通俗点的
快速排序简单的说就是选择一个基准,将比起大的数放在一边,小的数放到另一边。对这个数的两边再递归上述方法。如本题 66 13 51 76 81 26 57 69 23,以66为基准,升序排序的话,比66小的放左边,比66大的放右边, 类似这种情况 13 。。。 66。。。69 具体快速排序的规则...

快速排序方法的简单解释
一般快排在待排序的数字个数较少时,会选取其它排序来进行排列,比如插入排序。这里16,10数字个数已经太少,用插入排序排成10, 16 然后对 70,75,82,68进行排序……整个排序过程就这样

关于快速排序算法的稳定性是什么?
详细解释:堆排序、快速排序、希尔排序、直接选择排序是不稳定的排序算法,而冒泡排序、直接插入排序、折半插入排序、归并排序是稳定的排序算法。首先,排序算法的稳定性大家应该都知道,通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。在简单形式化一下,...

自学c语言 零基础 看什么书 该怎么学
《《啊哈C语言:小学生坐在马桶上都可以读懂的C语言编程入门书》.zip》百度网盘资源免费下载 链接:https:\/\/pan.baidu.com\/s\/1aEXrb1oxnRmMWUlafELpfQ 提取码:pusr啊哈C语言:小学生坐在马桶上都可以读懂的C语言编程入门书

递归是什么?要详细解释
这将导致失败,因为按顺序计算 -24 的阶乘时,首先不得不计算 -25 的阶乘;然而这样又不得不计算 -26 的阶乘;如此继续。很明显,这样永远也不会到达一个终止点。因此在设计递归函数时应特别仔细。如果怀疑其中存在着无限递归的可能,则可以让该函数记录它调用自身的次数。如果该函数调用自身的次数太多...

按键精灵如何使用?
按键精灵提供了非常简单的插入脚本方式,使用普通命令面板就可以完成整个插入脚本的过程。我们要制作的是鼠标连点器,所以要找的就是鼠标的命令。点击在编辑器左边的【脚本】,然后点击【基本命令】,最后点击【鼠标命令】。这时鼠标的命令就展开了。我们可以看到界面上有鼠标动作的命令,默认的命令是【左键...

对调是什么意思
所谓对调操作,就是交换两个变量的值,使它们的值互换。通俗点说,就是把A变量的值取出来,放到B变量里去,把B变量的值取出来,放到A变量里去。对于一个程序来说,进行对调操作可以让程序执行更灵活,简化代码的逻辑结构。对调的操作可以在任何时间发生,并且没有严格的时序限制。对于一些实时性要求较...

计算机4级都考什么?
自己先做,不会做再看参考的例程,想通了以后再上机实践,这样反复练习20多道题后,基本上就能达到考纲的要求。 3. 模拟测试 检验自己的考试实力的最好方法是用全真模拟考试软件进行自测,然后针对不足部分重点进行复习。模拟考试软件是历届考试题的汇集,包括上机和笔试,基本上涵盖了考试的要求和题型。在读懂教材、做...

计算机软体详细资料大全
计算机软体( Sofare,也称软体)是指计算机系统中的程式及其文档,程式是计算任务的处理对象和处理规则的描述;文档是为了便于了解程式所需的阐明性资料。程式必须装入机器内部才能工作,文档一般是给人看的,不一定装入机器。基本介绍 中文名 :计算机软体 外文名 :Sofare 释义,软体的概念,软体的...

相似回答