快速排序算法(Java实现)

Posted 梁公子的备忘录

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序算法(Java实现)相关的知识,希望对你有一定的参考价值。

    本文延续前述《经典排序算法》的代码,在其基础上介绍一种新的排序算法——快速排序(Quick Sort),快速排序是目前应用最为广泛的算法,主要原因是其实现方式简单并且在一般应用中排序速度很快,并且快速排序是原址排序(只需要一个很小的辅助栈),同时其将长度为N的序列进行排序所需的时间正比于NlogN,前述算法均无法同时具备这两个优点。另外,快速排序的内循环比大多数排序算法都要短小,因此快速排序无论是理论上还是工程上都要更快。

    本程序使用Java™ SE Runtime Environment (build 12.0.2+10),编译器使用IntelliJ IDEA。下面是快速排序算法的源码QuickSort.java、测试程序SortTest.java以及运行结果。注意,本程序使用到了前述《经典排序算法》static BubbleSort.exchange(array,i,j)方法。

QuickSort.java源码:

package SortAlgorithms;import java.util.Arrays;
class QuickSort{ QuickSort(int[] array) { System.out.println("Quick Sorting:"); Sort(array,0,array.length-1); }
private void Sort(int[] array, int lowSentry, int highSentry){ if(highSentry > lowSentry) { int baseElement = array[lowSentry]; int i = lowSentry; int j = highSentry; while (i < j) { while (baseElement <= array[j] && i < j) { j--; } while (baseElement >= array[i] && i < j) { i++; } BubbleSort.exchange(array, i, j); }
BubbleSort.exchange(array, i, lowSentry); System.out.println(Arrays.toString(array)); Sort(array, lowSentry, j - 1); Sort(array, j + 1, highSentry); } }}

SortTest.java源码:

package SortAlgorithms;
import java.util.Arrays;
public class SortTest { private static int[] arrayReset() { int[] array = {6,10,9,8,7,6,5,4,3,2,1,0,15}; System.out.println("Array has been reset."); System.out.println("Array is "+Arrays.toString(array)); return array; }
public static void main(String[] args){ int[] a = arrayReset(); new QuickSort(a); }}

运行结果如下:

/Library/Java/JavaVirtualMachines/jdk-12.0.2.jdk/Contents/Home/bin/java "-javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=54321:/Applications/IntelliJ IDEA.app/Contents/bin" -Dfile.encoding=UTF-8 -classpath /Users/liangqian/IdeaProjects/排序算法/out/production/排序算法 SortAlgorithms.SortTestArray has been reset.Array is [6, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 15]Quick Sorting:[4, 0, 1, 2, 3, 6, 5, 6, 7, 8, 9, 10, 15][3, 0, 1, 2, 4, 6, 5, 6, 7, 8, 9, 10, 15][2, 0, 1, 3, 4, 6, 5, 6, 7, 8, 9, 10, 15][1, 0, 2, 3, 4, 6, 5, 6, 7, 8, 9, 10, 15][0, 1, 2, 3, 4, 6, 5, 6, 7, 8, 9, 10, 15][0, 1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 10, 15][0, 1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 10, 15][0, 1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 10, 15][0, 1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 10, 15][0, 1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 10, 15]
Process finished with exit code 0

下面以运行结果为例,对快速排序算法进行解释:

本文的快速排序算法首先会选定序列的一个元素作为基准元素,用这一基准元素将序列分成两部分,左边的元素均小于基准元素,而右边的元素均大于基准元素。参见运行结果第五行,基准元素为6,6左边的元素均小于6,右边的元素均大于6。然后采用递归的方式,对6左右两边的序列继续采用类似的方法进行排序,直到序列无法再分为止,排序完成。

算法第一次运行结果为:

[4, 0, 1, 2, 3, 6, 5, 6, 7, 8, 9, 10, 15]

程序构建了一个循环,两个指针分别从序列最左端和最右端进行搜索,左指针搜索大于基准的元素,右指针搜索小于基准值的元素,两个指针均找到合适的值就将其交换位置,因此程序第一次交换了[10,0]、[9,1]、[8,2]、[7,3]的位置,然后将6与4的位置进行了交换,从最初的序列运行至运行结果第五行的详细运行结果如下:

[6, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, 15][6, 0, 1, 8, 7, 6, 5, 4, 3, 2, 9, 10, 15][6, 0, 1, 2, 7, 6, 5, 4, 3, 8, 9, 10, 15][6, 0, 1, 2, 3, 6, 5, 4, 7, 8, 9, 10, 15][6, 0, 1, 2, 3, 6, 5, 4, 7, 8, 9, 10, 15][401236567891015]

可以看到第六行的是6的左子列进行一次基准元素为4的排序:

[3, 0, 1, 2, 4, 6, 5, 6, 7, 8, 9, 10, 15]

由于该子列无大于4的值,因此4最终位于该子列的最右端。接下来以3为基准元素排序子列[3,0,1,2]:

[2, 0, 1, 3, 4, 6, 5, 6, 7, 8, 9, 10, 15]

接下来以2为基准元素排序子列[2,0,1]:

[1, 0, 2, 3, 4, 6, 5, 6, 7, 8, 9, 10, 15]

接下来以1为基准排序[1,0]:

[0, 1, 2, 3, 4, 6, 5, 6, 7, 8, 9, 10, 15]

接下来依据“堆栈思路”将所有基准元素的右半边进行排序,直至排序完成。

源代码文件已上传至:

https://github.com/Mr-memorandum/Algorithms.git

全文完。

以上是关于快速排序算法(Java实现)的主要内容,如果未能解决你的问题,请参考以下文章

快速排序算法(Java实现)

数据结构-排序之快速排序(使用Java代码实现)

数据结构-排序之快速排序(使用Java代码实现)

数据结构-排序之快速排序(使用Java代码实现)

排序算法之快速排序(Java)

排序算法之快速排序(Java)