快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比 较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构 上很有效率地被实现出来。
快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。
算法步骤:
1 从数列中挑出一个元素,称为 “基准”(pivot),
2 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
3 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
代码:
文件QucikSort.java
package Lee.sort;
public class QucikSort {
/*
* 递归排序
* */
public void qucik_Sort(int sort[], int left, int right){
//有效性检验
if(null == sort || left >= right){
System.out.println("array invalid.");
return ;
}
if(left < right){
int div = partition(sort, left, right);
qucik_Sort(sort, left, div - 1);
qucik_Sort(sort, div + 1, right);
}
}
/*
* 划分数组元素
* 返回基准元素的位置,然后再对左右两边无序的元素分别找基准值,直到其无左右元素(即成为单个元素)
* */
private int partition(int sort[], int left, int right){
int x = sort[left];
int i = left + 1;
int j = right;
while(true){
while(j >= i && sort[j] > x) //找到第一个小于x的元素
j--;
while(i <= j && sort[i] < x) //找到第一个大于x的元素
i++;
if(i >= j){
break;
}
swap(sort, i, j); //交换找到的元素
//i++;
//j--;
//printArray(sort);
}
sort[left] = sort[j]; //重新定位基准元素
sort[j] = x;
printArray(sort);
return j;
}
/**
* 交换元素
* */
private void swap(int sort[], int i, int j){
int temp;
temp = sort[i];
sort[i] = sort[j];
sort[j] = temp;
}
public void printArray(int sort[]){
for(int i = 0; i < sort.length; i++){
System.out.print(sort[i] + " ");
}
System.out.println();
}
}
文件SortMain.java
package Lee.sort;
public class SortMain {
/**
* @param args
*/
public static void main(String[] args) {
//MergeSort ms = new MergeSort();
QucikSort qs = new QucikSort();
int sort[] = {8, 43, 7, 16, 10, 9, 5, 2, 20};
//ms.merge_Sort(sort, 0, sort.length - 1);
qs.qucik_Sort(sort, 0, sort.length - 1);
}
}
运行结果:
5 2 7 8 10 9 16 43 20
2 5 7 8 10 9 16 43 20
array invalid.
array invalid.
2 5 7 8 9 10 16 43 20
array invalid.
2 5 7 8 9 10 16 43 20
array invalid.
2 5 7 8 9 10 16 20 43
array invalid.
array invalid.