题解 | #排序#
排序
http://www.nowcoder.com/practice/2baf799ea0594abd974d37139de27896
双边快排 选取起始位置为中轴,从右边开始找到第一个比中中轴小的,从左边找到第一个比中轴大于等于的(不然走不动,交换位置,直接交换走了中轴)循环。左边维护的始终小于等于轴的边界,当两边相遇则说明找到中轴的位置,与中轴交换
代码: import java.util.*;
public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 将给定数组排序 * @param arr int整型一维数组 待排序的数组 * @return int整型一维数组 */ public int[] MySort (int[] arr) { // write code here quick(arr,0,arr.length-1); return arr;
}
private static void quick(int[] a, int l, int h) {
if(l >= h){
return;
}
int p = partition(a,l,h);
quick(a,l,p-1);
quick(a,p+1,h);
}
private static int partition(int[] a, int l, int h) {
int pv = a[l];
int i = l;
int j = h;
while (i < j) {
// j 从右找小的
while (a[j] > pv) {
j--;
}
// i 从左找大的
while (i < j && a[i] <= pv) {
i++;
}
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
int temp = a[l];
a[l] = a[j];
a[j] = temp;
return j;
}
}
