Java实现快速排序 引入随机性使得算法对所有的输入都能获得较好的期望性能
package cn.edu.sortalgorithm;
import java.util.Random;
public class QuickSort {
/************快速排序***************************/
/*partition的作用是获得某一主元素的最终位置,使得该元素左边的数据不大于该元素,右边的数据不小于该元素*/
public static int partition(int array[], int left, int right){
/*快速排序引入随随机性,得到随机化的快排版本,使得算法对所有的输入都能获得较好的期望性能*/
Random random = new Random();
//生成left~right(包含边界)之间的一个随机整数
int randomIndex = random.nextInt(right-left+1) + left;
//元素大小交换,保证随机性
int tmp = array[left];
array[left] = array[randomIndex];
array[randomIndex] = tmp;
//选取主元
int tmpVal = array[left];
while(left < right){//从左右两边交替扫描知道left=right
while(right > left && array[right] >= tmpVal){
right--;
}
array[left] = array[right];
while(left < right && array[left] <= tmpVal){
left++;
}
array[right] = array[left];
}
array[left] = tmpVal;//将主元素放在其最终的位置上
return left;
}
public static void quickSort(int array[], int left, int right){
if(left < right){//待排序的元素至少有两个的情况
int pivot = partition(array, left, right);
System.out.println(pivot);
printArray(array);
quickSort(array, left, pivot-1);
quickSort(array, pivot+1, right);
}
}
/********打印所有数组元素****************************/
public static void printArray(int array[]){
for(int k=0; k<array.length; k++){
System.out.print(array[k] + " ");
}
System.out.println();
}
public static void main(String[] args) {
int inputArray[] = {8000, 49, 38, 65, 97, 76, 13, 27, 49, 49, 55, 04, 49, 1000, -1};
System.out.println("the input array is : ");
printArray(inputArray);
quickSort(inputArray, 0, inputArray.length-1);
System.out.println("the output array is : ");
printArray(inputArray);
}
}