美文网首页
Java排序之快速排序

Java排序之快速排序

作者: 最美的谣言 | 来源:发表于2017-06-21 14:09 被阅读0次

前言

快速排序作为排序算法的王者,我们没有理由不掌握它

引用自大话数据结构.png
  • 快速排序的基本思想:
    通过一趟排序将待排序记录分割成独立的两部,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的.

  • 快速排序的快速理解:
    把数据分成左右两部分,左边的所有数据都比右边数据小, 再把左右两部分的数据按同样的方法排序. 很明显快速排序是不稳定的,排序的结果次序可能不一致.

举例分析

int s[] = {52,78,12,99,5,18,80,32,66};

快速排序示意图.png

画了一张很简单的图, 力求简单.每个格子想象成一个待挖的坑.

第一步: 我们先随便从数组中拿一个数据作为基准数p.便于演示,就用s[0] 吧,即p=s[0] . 注意,我们在s[0]处拿了一个数据,我们就想象从数组s中挖了一个坑,而且这个坑的位置就是s[0],下面我们来看看如何填坑

第二步:找 s[k] < p :从索引K的结尾处开始向前找. 找比s[0] (即p)小的数.如图中的绿色箭头方向,标号①表示绿色查找优先红色查找,很明显s[7]=32 < s[0]=52 , 此时我们把32挖出来去填s[0]的坑, 让s[0]=s[7] , 所以此时s[0]为32,就是说我们把第一个坑填了. 但是有一个新坑k[7],此时的数据顺序:
32,78,12,99,5,18,80,32,66

第三步:找 s[i] > p :从索引 i 的开始处从前向后找.找比s[0] (即p)大的数.如图中的红色箭头方向.我们看到 s[1] = 78 > p=52 .所以我们挖出s[1]的数据放到上一步的坑中,就是k[7]了.此时我们的新坑i[1] , 让 s[7]=s[1],此时的数据顺序:
32,78,12,99,5,18,80,78,66

我们在第二步中得到了K=7,在第三步中得到了i=1.那么在下一轮的查找中k从6开始,然后i从2开始.这样重复执行第二步然后第三步,直到 i = k . 这样就完成了左边的数据都是小于右边的数.之后用同样的方法从第一步开始分别对左右部分的数据进行排序,得到的就是最终的结果

Java代码示例

原理讲完了,我们来撸一下java的实现.

public void quickSort(int arr[],int sIndex,int eIndex){
        if (sIndex < eIndex) {
            int p = arr[sIndex] , i = sIndex , k = eIndex;
            while (i < k) {
                while(i < k && arr[k] >= p) // 从右向左找
                    k--;

                if (i < k ) arr[i++] = arr[k];

                while(i < k && arr[i] < p) // 从左向右找
                    i++;

                if (i < k ) arr[k--] = arr[i];
            }
            arr[i] = p;
            quickSort(arr, sIndex, i - 1); // 递归
            quickSort(arr, i + 1, eIndex);
        }
}

结束

快速排序还有很多优化版本,但是基本思想都是类似的,很大程度上取决P的选择,比如如果P处于数列的中间,那么就趋于平衡树,效率会提高.总的来说,快速排序名副其实,我们应该好好学习它.谢谢大家!

参考文章
白话经典算法系列之六 快速排序 快速搞定

相关文章

  • java排序方法资料

    java排序,效率高的是哪种排序方法 JAVA快速排序(高效) java中常用的几种排序算法 相关代码: /* *...

  • 数据结构&算法(一)

    一、Java实现快速排序算法 二、Java实现折半插入排序算法 三、Java实现冒泡排序算法

  • 面试知识点

    排序冒泡排序快速排序选择排序插入排序二路归并 查找二分查找 排序和查找的java实现 java语言Java字符串字...

  • 七大排序算法之快速排序

    七大排序算法之快速排序 @(算法笔记)[排序算法, 快速排序, C++实现] [TOC] 快速排序的介绍: 快速排...

  • 常见排序的java实现

    常见排序的java实现 常见排序java实现 插入排序(二分插入排序) 希尔排序 快速排序(三数中值快排) 冒泡排...

  • 排序算法Java实现

    本文会通过Java语言实现:冒泡排序,插入排序,选择排序,归并排序,快速排序,桶排序,计数排序,基数排序,希尔排序...

  • Java基础01 冒泡排序

    冒泡排序 Java中有很多种排序:冒泡排序、快速排序、选择排序、插入排序、希尔排序,甚至还有基数排序、鸡尾酒排序、...

  • Java排序之快速排序

    前言 快速排序作为排序算法的王者,我们没有理由不掌握它 快速排序的基本思想:通过一趟排序将待排序记录分割成独立的两...

  • 快速排序

    快速排序Java实现

  • 实现几种常见排序方法

    Java实现几种常见排序方法 日常操作中常见的排序方法有:冒泡排序、快速排序、选择排序、插入排序、希尔排序,甚至还...

网友评论

      本文标题:Java排序之快速排序

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