Java 快速排序(QuickSort)原理及实现代码

 更新时间:2014年01月16日 15:36:02   投稿:shangke  
这篇文章主要介绍了Java 快速排序(QuickSort)原理及实现代码,有需要的朋友可以参考一下

快速排序(QuickSort )是常用到的效率比较高的一种排序算法,在面试过程中也经常提及。下面就详细讲解一下他的原理、给出一个Java版本的实现。

快速排序思想:

快速排序的过程——挖坑填数法(这是一个很形象的名称),对一个元素集合R[ low ... high ] ,首先取一个数(一般是R[low] )做参照 , 以R[low]为基准重新排列所有的元素。

所有比R[low]小的放前面,所有比R[low] 大的放后面,然后以R[low]为分界,对R[low ... high] 划分为两个子集和,再做划分。直到low >=  high 。

比如:对R={37, 40, 38, 42, 461, 5, 7, 9, 12}进行一趟快速排序的过程如下(注:下面描述的内容中元素下表从 0 开始):

原始序列3740384246157912
一:high-->low1240384246157912
一:low --> high1240384246157940
二:high-->low129384246157940
二:low --> high1293842461573840
三:high --> low129742461573840
三:low -->high1297424615423840
四:high --> low129754615423840
四:low --> high12975461461423840
一趟排序结果1297537461423840

开始选取基准 base = 37,初始位置下表 low = 0 , high = 8  , 从high=8,开始如果R[8] < base ,  将high位置中的内容写入到R[low]中, 将high位置空出来, low = low +1 ;

从low开始探测,由于low=1 , R[low] > base ,所以将R[low]写入到R[high] , high = high -1 ;

检测到low < high ,所以第一趟快速排序仍需继续:

此时low=1,high=7,因为 R[high] < base ,所以将 R[high] 写入到到R[low]中,low = low + 1;

从low开始探测,low = 2 , R[low] >base ,所以讲R[low]写入到R[high],high=high-1;

继续检测到 low 小于high


此时low=2,high=6,同理R[high] < base ,将R[high] 写入到R[low]中,low=low+1;

从low继续探测,low = 3 , high=6 , R[low] > base , 将R[low]写入到R[high]中,high = high-1;

继续探测到low小于high

此时low=3,high=5,同理R[high] < base,将R[high]写入到R[low]中,low = low +1;

从low继续探测,low = 4,high=5,由于R[low] > base , 将R[low]写入到R[high]中,high = high -1 ;

此时探测到low == high == 4 ;该位置即是base所在的位置,将base写入到该位置中.

然后再对子序列Rs1 = {12,9,7,5} 和 Rs2={461,42,38,40}做一趟快速排序,直到Rsi中只有一个元素,或没有元素。

(注: 在以上表单中可以看到一趟排序中有一些重复的数据(原始数据中没有重复的数据),这是因为没有清除该位置的数据,我们在特定的时间看该内存块的数据依然是它,直到下一次将数据写入该位置位置 —— 在此该位置的数据是一个没有意义脏数据,称之为 “坑”)

快速排序的Java实现:

复制代码 代码如下:

private static boolean isEmpty(int[] n) {
        return n == null || n.length == 0;
    }

    // ///////////////////////////////////////////////////
    /**
     * 快速排序算法思想——挖坑填数方法:
     *
     * @param n 待排序的数组
     */
    public static void quickSort(int[] n) {
        if (isEmpty(n))
            return;
        quickSort(n, 0, n.length - 1);
    }

    public static void quickSort(int[] n, int l, int h) {
        if (isEmpty(n))
            return;
        if (l < h) {
            int pivot = partion(n, l, h);
            quickSort(n, l, pivot - 1);
            quickSort(n, pivot + 1, h);
        }
    }

    private static int partion(int[] n, int start, int end) {
        int tmp = n[start];
        while (start < end) {
            while (n[end] >= tmp && start < end)
                end--;
            if (start < end) {
                n[start++] = n[end];
            }
            while (n[start] < tmp && start < end)
                start++;
            if (start < end) {
                n[end--] = n[start];
            }
        }
        n[start] = tmp;
        return start;
    }

在代码中有这样一个函数:

复制代码 代码如下:

 public static void quickSortSwap(int[] n, int l, int h)

关于快速排序就写到这里了。

相关文章

  • Java实现最小高度树

    Java实现最小高度树

    本文主要介绍了Java实现最小高度树,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • SpringBoot框架整合Mybatis简单攻略

    SpringBoot框架整合Mybatis简单攻略

    这篇文章主要介绍了SpringBoot框架整合Mybatis的简单攻略,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2021-10-10
  • Spring中的EurekaServer启动详解

    Spring中的EurekaServer启动详解

    这篇文章主要介绍了Spring中的EurekaServer启动详解,初始化eureka,包含eureka集群的同步和发布注册,这个方法时重写ServletContextListener#contextInitialized,是eureka启动的入口了,需要的朋友可以参考下
    2023-11-11
  • 老生常谈Java动态编译(必看篇)

    老生常谈Java动态编译(必看篇)

    下面小编就为大家带来一篇老生常谈Java动态编译(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • SpringBoot集成E-mail发送各种类型邮件

    SpringBoot集成E-mail发送各种类型邮件

    这篇文章主要为大家详细介绍了SpringBoot集成E-mail发送各种类型邮件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • java实现同步回调的示例代码

    java实现同步回调的示例代码

    同步回调是一种在调用代码中同步执行回调函数的编程模式,在Java中,通过定义和实现接口来构建同步回调,本文就来介绍一下如何实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-09-09
  • fastJson泛型如何转换的实现

    fastJson泛型如何转换的实现

    这篇文章主要介绍了fastJson泛型如何转换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • java单例模式学习示例

    java单例模式学习示例

    java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种,下面提供了单例模式的示例
    2014-01-01
  • Java生成范围内随机整数的三种方法

    Java生成范围内随机整数的三种方法

    在Java中生成随机数的场景有很多,下面这篇文章主要给大家介绍了关于Java生成范围内随机整数的三种方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • 解决Java 结构化数据处理开源库 SPL的问题

    解决Java 结构化数据处理开源库 SPL的问题

    这篇文章主要介绍了Java 结构化数据处理开源库 SPL的问题,Scala提供了较丰富的结构化数据计算函数,但编译型语言的特点,也使它不能成为理想的结构化数据计算类库,对此内容感兴趣的朋友一起看看吧
    2022-03-03

最新评论