package com.liany.demo.sort;
import java.util.Random;
/**
* 参考wiki源码写了一遍,并加了注释和自己的理解。
*
* 步骤:
* 1、取一随机位置的元素作为基准(pivot,或叫枢纽)
* 2、将基准移到最后位置(方便数组的其它元素与之比较),将小于此基准的元素放到数组的前面,
然后将基准移到所有比它小的元素的最大序号的下一个位置。
* 3、将这个基准的新位置返回,并作为迭代的分割点。
* 4、迭代比基准的前面、后面两个部分。
*
* @author modiliany
* @date: 2012-04-05
*/
public class MyQuickSort {
private Random random = new Random();
/**
* 交换
* @param array
*/
public void swap(int[] array, int i, int j){
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
/**
* 查找枢纽的索引号
*/
public int getPivotIndex(int[] array, int begin, int end){
int index = begin + random.nextInt(end-begin+1);
int pivot = array[index];
//把pivot换到最后
swap(array, index, end);
for(int i=index=begin; i < end; i++){
if(array[i] < pivot){
//index从0开始计算了,记录小于pivot的值
//将小于pivot的值的元素移动到index位置
swap(array, index++, i);
}
}
swap(array, index, end);//将pivot放到所有比它小的元素的下一个位置(即此时的index位置)。
return index;
}
/**
* 快速排序法(Divide and conquer)
* @param array 待排序的数据
* @param begin 开始序号
* @param end 最后一个元素的序号
*/
public void quickSort(int[] array, int begin, int end){
if(end > begin){
int index = getPivotIndex(array, begin, end);
quickSort(array, begin, index-1);
quickSort(array, index+1, end);
}
}
/**
* @param args
*/
public static void main(String[] args) {
int [] array = {3, 1, 7, 5, 2, 9, 10, 4, 8, 6};
MyQuickSort sort = new MyQuickSort();
sort.quickSort(array, 0, array.length-1);
//输出
for(int val : array){
System.out.println(val);
}
}
}
wiki:
http://zh.wikipedia.org/zh-cn/快速排序
这里为了简单和方便理解排序的原理,只用了int数组。对象要比较的话,可以自己实现Comparator接口。