快速排序算法(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.SortTest
Array has been reset.
Array is [6, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 15]
Quick Sorting:
[ ]
[ ]
[ ]
[ ]
[ ]
[ ]
[ ]
[ ]
[ ]
[ ]
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]
[4, 0, 1, 2, 3, 6, 5, 6, 7, 8, 9, 10, 15]
可以看到第六行的是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实现)的主要内容,如果未能解决你的问题,请参考以下文章