快速排序JAVA实现。
快速排序是一种“分而治之、各个击破”的观念。
快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。
步骤为:
- 从数列中挑出一个元素,称为 "基准"(pivot),
- 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分割结束之后,该基准就处于数列的中间位置。这个称为分割(partition)操作。
- 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
递回的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递回下去,但是这个算法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
ref:http://zh.wikipedia.org/wiki/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F
public class Quicksort {
public static final Random RND = new Random();
private static void swap(Object[] array, int i, int j) {
Object tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
/**根据给定范围原地分割
* @param <E>
* @param array
* @param begin
* @param end
* @return
*/
private static <E extends Comparable<? super E>> int partition(E[] array,
int begin, int end) {
int index = begin + RND.nextInt(end - begin + 1);
E pivot = array[index];
swap(array, index, end);
for (int i = index = begin; i < end; ++i) {
//将所有小于pivot基准的元素移动到数组前面
if (array[i].compareTo(pivot) < 0) {
swap(array, index++, i);
}
}
swap(array, index, end);
return (index);
}
private static <E extends Comparable<? super E>> void qsort(E[] array,
int begin, int end) {
if (end > begin) {//递归执行分割
int index = partition(array, begin, end);
qsort(array, begin, index - 1);
qsort(array, index + 1, end);
}
}
public static <E extends Comparable<? super E>> void sort(E[] array) {
qsort(array, 0, array.length - 1);
}
public static void main(String[] args) {
Integer[] srcArr = new Integer[100000];
for (int i = 0; i < 100000; i++) {
srcArr[i] = (int) (Math.random() * 100000);
}
System.out.println(srcArr.length);
long t1 = System.currentTimeMillis();
sort(srcArr);
long t2 = System.currentTimeMillis();
System.out.println("");
System.out.println("====================================" + (t2 - t1));
// for (Integer integer : srcArr) {
// System.out.print(integer + ",");
// }
}
}
这篇博文基本一样的code有一些注释ref:http://modiliany.iteye.com/blog/1476085