三段分割法快排改造的快速分割求第K大
寻找第K大
http://www.nowcoder.com/questionTerminal/e016ad9b7f0b45048c58a9f27ba618bf
public int[] MySort (int[] arr) {
quickSort(arr,0,arr.length-1);
return arr;
}
// 改进后的快排
public void quickSort(int[] arr,int left ,int right){
//快排
//判断是否能进入快排
if(left < right){
//找到枢纽元
int pivot = findPivot(arr,left,right);
int i = left , j = right-1;
//开始分割数组 ,right的值此时一定比枢纽元大 right-1是枢纽元
while(true){
//刚开始想了想 感觉这里会越界 ,然后突然想起
//左边界和右边界已经被left 和 right 定死了, i和j都不会越界
while(arr[++i] < pivot);
while(j>left && arr[--j] > pivot);
if(i<j){
swap(arr,i,j);
}else{
break;
}
}
//还原枢纽元
if(i<right){
swap(arr,i,right-1);
}
//递归左边数组排序
quickSort(arr,left,i-1);
quickSort(arr,i+1,right);
}
}
//三等分割字符函数
public int findPivot(int[] arr,int left ,int right){
int center = left+(right-left)/2;
if(arr[left] > arr[center]){
swap(arr,left,center);
}
if(arr[left] > arr[right]){
swap(arr,left,right);
}
if(arr[center] > arr[right]){
swap(arr,center,right);
}
//这里取头尾中 三个位置的数据排序好 还可以减少快排时一步操作 ,right已经在center后面了
swap(arr,center,right-1);
return arr[right-1];
}
//交换函数
public void swap(int[] arr,int n1,int n2){
int tmp = arr[n1];
arr[n1] = arr[n2];
arr[n2] = tmp;
}
海康威视公司福利 1409人发布