标签:
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
标签:
原文地址:http://my.oschina.net/xiaoxishan/blog/373334