一.简介
在排序算法中,快速排序算是里面的佼佼者。它是对冒泡排序的一种改进,基本思想是,通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。这里提到了分割成两部分,使我们想到了分而治之的思想,其实就是让另外两部分分别去实现之前的排序而已。因为要找出关键字,用关键字来分割两部分,所以最好的情况是这个关键字是在排序数组的中间位置。最极端的情况是这个关键字是最大值或最大值。
排序过程:
二.代码实现
public class QuartSort { public static void main(String[] args) { int a[] = {5, 2, 6, 3, 7, 9, 10, 4, 8}; sort(a, 0, a.length - 1); print(a); } /** * 打印数组 * * @param a */ private static void print(int[] a) { for (int i = 0; i < a.length; i++) { System.out.print(a[i] + " "); } System.out.println(); } /** * 快速排序 * * @param a 数组 * @param low 低位 * @param high 高位 */ static void sort(int[] a, int low, int high) { if (low < high) { //判断低位要小于高位 int index = partition(a, low, high); //找出关键字key的位置,而且大于key的都在右边,小于key都在左边 sort(a, low, index - 1); //左边再做快速排序 sort(a, index + 1, high); //右边再做快速排序 } } /** * 找出关键字key的位置,而且大于key的都在右边,小于key都在左边 * * @param a 数组 * @param low 低位 * @param high 高位 * @return 返回关键字的位置 */ static int partition(int[] a, int low, int high) { int key = a[low]; //保存关键字,默认都去低位的值 while (low < high) { //低位要小于高位 while (low < high && a[high] >= key) { //从右往左找,如果找到数组大于关键字,高位减1 --high; } a[low] = a[high]; //在低位小于高位的情况下,如果高位的值小于了key,将这个高位的值放到低位上面 while (low < high && a[low] <= key) { ++low; } a[high] = a[low]; ////在低位小于高位的情况下,如果低位的值大于了key,将这个低位的值放到高位上面 } a[low] = key; //将关键字赋值到低位上 return low; //返回关键字的位置 } }
注释代码上面已经写的很清楚了,结果:
2 3 4 5 6 7 8 9 10
三.总结
就平均时间而言,排序算法被认为是目前最好的一种内部排序方法。它的时间复杂度是nlog(n)。
下一篇:堆排序