给定无序的数组,进行排序。
分析:
(1)快速排序是一种快速的分治算法,之所以快是因为非常紧凑而又高度优化的内部循环。
(2)最佳情况运行时间O(NlogN),最坏情况运行时间O(N的平方),平均情况运行时间O(NlogN)。
(3)通过选择任意元素,称为支点,分割成为两个互不相交的组,然后递归进行分割排序。
(4)通常选择中间元素((low+high)/2)作为支点,也可以选择三个元素的中值分割,第一,中间和最后元素。
算法[O(NlogN)]:
public void quickSort(int[] a) {
quickSort(a, 0, a,length-1) ;
}
public void quickSort(int[] a, int low, int high) {
int middle = (low+high)/2 ;
//对第一、中间、最后三个元素进行排序
if( a[middle].compareTo(a[low]) < 0 )
swap(a, low, middle) ;
if( a[high].compareTo(a[low] < 0))
awap(a, low, high) ;
if( a[high].compareTo(a[middle]) < 0)
awap(a, high, middle) ;
swap(a, middle, high -1 ) ; //把中间元素与倒数第二交换
int pivot = a[high - 1] ;
int i, j ;
for( i=low,j=high-1; ; ) {
while( a[++i].compareTo(pivot) < 0) //从前开始查找小于中间元素的位置
;
while( a[--j].compareTo(pivot) > 0) //从后开始查找大于中间元素的位置
;
if( i>=j )
break ;
swap(a, i, j) ; //把大小两个元素交换
}
swap( a, i , high-1 ) ; //把放到后面的元素换回中间
//递归排序两个子数组
quickSort(a, low, i-1) ;
quickSort(a, i+1, high) ;
}