我是靠谱客的博主 土豪菠萝,最近开发中收集的这篇文章主要介绍快速排序——详细且简单易懂的讲解,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

假设现在要对{3,4,0,2,1,5,9,6,7,8}快速排序:需要在数组里选出一个数作为基准数,为了方便起见,可以选第一个数字5作为准基数
这里写图片描述
接着,需要把大于准基数的数放在准基数的右边,小于准基数的数放在准基数的左边:
这里写图片描述
但是,如何做到这点呢,接下来我详细说明:

方法很简单,从这个数组的两边开始进行探测,令i为数组的最左边,j为数组的最右边。
先让j从右出发往走走,找一个小于5的数,再从左出发往右走,找一个大于5的数,然后交换这两个数,直到i与j相遇。

这里写图片描述

首先让j出发,因为基准数选的是最左边得数,所以应该让右边的j先走,依次向左直到找到小于5的数0,再让i往右走直到找到大于5的数6。
这里写图片描述
然后交换这两个数:
这里写图片描述
接着继续走,j走到3,发现3比6小,然后i开始走,一直走到9,发现9比5大:
这里写图片描述
交换:
这里写图片描述
然后,j继续向左走,发现3比5小,i开始走,走到3,此时i和j相遇,所以此次探测结束
这里写图片描述
接着让基准数与3交换,让基准数归位:
这里写图片描述
到了这一步,已经把比5小的数放在了5的左边,把比5大的数放在了5的右边,但是左右都是乱的,所以接下来,还需要用刚才的方法处理左边和右边。
那么先处理5的左边吧:
这里写图片描述
同样的方法,选择左边的3作为基准数:
这里写图片描述
这里写图片描述
此时探测结束,再依次用同样的方法处理3的左边和右边。
……
……
……
接下来用一张图说明问题:
这里写图片描述

代码实现:

void QuickSort(int *a, int left, int right)
{
    if (left > right)
        return;

    int base = a[left];
    int i = left;
    int j = right;
    while (i < j)
    {
        while (a[j] >= base && i < j)
            j--;
        while (a[i] <= base && i < j)
            i++;
        if (i < j)
            swap(a[i], a[j]);
    }
    swap(a[left], a[i]);

    QuickSort(a, left, i - 1);
    QuickSort(a, i+1, right);
}

最后

以上就是土豪菠萝为你收集整理的快速排序——详细且简单易懂的讲解的全部内容,希望文章能够帮你解决快速排序——详细且简单易懂的讲解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部