快速排序思想与实现

作者: 蜗先生 | 来源:发表于2016-12-11 14:57 被阅读77次

无整理 不简书

快速排序相对其他排序算法比较难理解,有大牛曾形象的比喻成挖坑填数,我会把大牛的博客链接放在本文末尾,共同学习,在此我把快速排序比喻成挖坑填数 + 分治法。分治法就是将复杂的问题分解成规模较小的问题,再各个击破,分而治之。

例:快速排序算法把整数 32 56 14 6 78 23 按照从小到大的顺序排序。
在数列中选择某一个数作为基数(本例中选择第一个元素作为基数),以基数为准,小于等于基数的元素交换到基数的前面,大于基数的元素交换到基数的后面,这样就实现了把数列分成了小于等于基数的数列和大于基数的数列。再从小于等于基数的数列和大于基数的数列中再选择另一个基数重复上述操作,直到不能再分成更小的数列排序完成。

基数 32 挖第一个坑

32(坑) 56 14 6 78 23
从右向左与基数进行比较直到遇到第一个小于等于基数的元素
23小于32 把23填到32的坑里
23 56 14 6 78 23(坑)
从左往右与基数进行比较直到遇到第一个大于基数的元素(填入坑中的元素不再比较)
56大于32 把56填到23的坑里
23 56(坑) 14 6 78 56
从右向左与基数进行比较直到遇到第一个小于等于基数的元素(填入坑中的元素不再比较)
78 大于 32 比较前一个元素
6 小于 32 把6填到56 的坑里
23 6 14 6(坑) 78 56
从左往右与基数进行比较直到遇到第一个大于基数的元素(填入坑中的元素不再比较)
14 小于 32 比较后一个元素到达坑
从左往右与从右往左都到达坑的位置,把基数32填入坑,比较结束
23 6 14 32(基) 78 56

原数列分成两部分
I.小于等于32的部分:23 6 14
I.大于32的部分:78 56

I.小于等于32的部分:23 6 14

基数 23 挖第一个坑
23(坑) 6 14
从右向左与基数进行比较直到遇到第一个小于等于基数的元素(填入坑中的元素不再比较)
14 小于23 14填到23的坑里
14 6 14(坑)
从左往右与基数进行比较直到遇到第一个大于基数的元素(填入坑中的元素不再比较)
6 小于 23 比较后一个元素到达坑
从左往右与从右往左都到达坑的位置,把基数23填入坑,比较结束
14 6 23(基)

原数列分成一部分
(1).小于等于23的部分:14 6

基数 14 挖第一个坑
14(坑) 6
从右向左与基数进行比较直到遇到第一个小于等于基数的元素(填入坑中的元素不再比较)
6 小于 14 6 填到14的坑里
6 6(坑)
从左往右与从右往左都到达坑的位置,把基数14填入坑,比较结束
6 14(基)

II.大于32的部分:78 56

基数 78 挖第一个坑
78(坑) 56
从右向左与基数进行比较直到遇到第一个小于等于基数的元素(填入坑中的元素不再比较)
56 小于 78 56填入78的坑里
56 56(坑)
从左往右与从右往左都到达坑的位置,把基数14填入坑,比较结束
56 78(基)

排序结束 6 14 23 32 56 78

实现代码:

//快速排序
public int fastSort(int[] a, int l, int r)
{
    int i = l;
    int j = r;
    int x = a[i];
    while(i < j)
    {
        while(i < j && a[j] > x)
        {
            j--;
        }
        if(i < j)
        {
            a[i] = a[j];
            i++;
        }
        while(i < j && a[i] <= x)
        {
            i++;
        }
        if(i < j)
        {
            a[j] = a[i];
            j--;
        }
    }
    a[i] = x;
    return i;
}

//分治法
public void divide(int[] a, int l, int r)
{
    int m = fastSort(a, l, r);
    if(l != m)
    {
        divide(a , l, m - 1);
    }
    if(r != m)
    {
        divide(a, m + 1, r);
    }
}

如有错误之处,请指正。

扩展文章
常用三种排序算法的思想与实现
大牛博客链接
白话经典算法系列之六 快速排序 快速搞定

相关文章

  • 接触并理解 快速排序【基础+优化+三向切分】

    要点 算法思想与实现,优化思路,性能分析,三向切分,空间,优势 前言 快速排序之所以被称作“快速”,是因为快速排序...

  • 接触并理解 快速排序【基础+优化+三向切分】

    要点 算法思想与实现,优化思路,性能分析,三向切分,空间,优势 前言 快速排序之所以被称作“快速”,是因为快速排序...

  • 快速排序思想与实现

    无整理 不简书 快速排序相对其他排序算法比较难理解,有大牛曾形象的比喻成挖坑填数,我会把大牛的博客链接放在本文末尾...

  • java快速学习排序---快排算法

    一、快速排序是(挖坑法)是挖坑填数 + 分治来实现。 1.快速排序的基本思想: 2.快速排序的图示: 3.快速排序的算法

  • 算法-快速排序

    快速排序 变形 : 快速排序(剪枝法)-找出数组中第k小的数 采用快速排序的思想来实现。选一个数 baseValu...

  • 数据结构02-高效排序算法

    第二章 高效排序算法 第二章 高效排序算法一、快速排序基本思想快速排序图示一次划分C 语言实现Java 语言实现算...

  • JavaScript实现快速排序算法的最佳实践,没有之一

    1.快速排序的基本思想 长话短说,排序算法中快速排序的性能还是不错的,今天我就讲讲javascript中实现快速排...

  • java--快速排序

    1:基本思想: 快速排序是属于交换类排序,采用不断的比较和移动来实现排序。快速排序是一种非常高效的排序算法,它的实...

  • 不积跬步之快速排序

    快速排序使用了分治思想来实现。 和冒泡排序一样,快速排序也属于交换排序,通过元素直接的比较和交换位置来达到排序的目...

  • 快速排序算法

    快速 排序与冒泡排序类型 都是基于交换 但是效率比冒泡排序更高 快速排序思想首先设定一个分界值 将数...

网友评论

    本文标题:快速排序思想与实现

    本文链接:https://www.haomeiwen.com/subject/hyfymttx.html