三段分割法快排改造的快速分割求第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; }