package org.rev.algorithm; /** * 快速排序 算法复杂度Ο(n log n) * * 1.挑出一个基准数据。 * * 2.给数列排序,大于基准数据的放在右边,小于基准数据的放在左边。 * * 3.递归地,对小于基准数据的子数列和大于基准数据的子数列排序。 */ public class QuickSort { public static void main(String[] args) { int[] data = {39, 38, 55, 97, 86, 37, 12, 4, 11, 18}; QuickSort qs = new QuickSort(); qs.quick(data); for (int i = 0; i < data.length; i++) { System.out.print(data[i] + " "); } System.out.println(); } public void quick(int[] data) { if (data.length > 0) { // length是0,就不能减1了。 quickSort(data, 0, data.length - 1); } } /* * 递归地,对小于基准的数列和大于基准的数列排序。 */ private void quickSort(int[] data, int low, int high) { if (low < high) { // 如果没有这个判断,递归会无法退出,导致堆栈溢出异常。 int middle = getMiddle(data, low, high); // 将数组一分为二。 quickSort(data, low, middle - 1); // 对低端递归排序 quickSort(data, middle + 1, high); // 对高端递归排序 } } /* * 分治排序,所有比基准小的数据都放在基准的前面,比基准大的都放在基准的后面。 * * 如此,基准就处于数列靠中间的位置,并返回基准的位置。 */ private int getMiddle(int[] data, int low, int high) { int tmp = data[low]; // 以数组的第一个元素作为基准元素 while (low < high) { while ((low < high) && (data[high] > tmp)) { high--; } data[low] = data[high]; // 比基准小的数据,移到低端。 while ((low < high) && (data[low] < tmp)) { low++; } data[high] = data[low]; // 比基准大的数据,移到高端。 } data[low] = tmp; return low; } }
参考http://zh.wikipedia.org/wiki/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F
时间: 2024-10-06 22:51:04