快速排序
先附赠一张时间复杂度表
图片来源:https://www.cnblogs.com/nannanITeye/archive/2013/04/11/3013737.html
把大象装进冰箱需要几步?恭喜,学会抢答了,三步
那实现快排呢?大体分为四步
第一步:走个形式,用来引出真正得快排!
public int[] MySort (int[] arr) {
//引出快排实体
quickSort(arr,0,arr.length-1);
return arr;
}
第二步:写出quickSort方法。quickSort方法需要注意得是,由于快排是不断得将区间分为两部分,因此参数为:int[] arr(数组),int left(区间左,开始),int right(区间右,结束),左闭右闭。
public void quickSort(int[] arr,int left,int right){
if(left >= right){
return;
}
//具体方法实现,看第三步,partition
}
第三步:第三步是第二步得实现基础。先给代码,再理解。
public int partition(int[] arr,int left,int right){
int i = left,j = right+1;
int temp = arr[left];
while(true){
while(arr[++i] <= temp) if(i == right) break;
while(arr[--j] >= temp) if(left == j) break;
if(i >= j){
break;
}
int ex1 = arr[i];
arr[i] = arr[j];
arr[j] = ex1;
}
int ex2 = arr[left];
arr[left] = arr[j];
arr[j] = ex2;
return j;
}
快排得思想就是:
1)以left为基准点,进行比较。int temp = arr[left];
2)左侧从left+1开始遍历,直至找到比temp大的值(下标为i);右侧从right开始遍历,直至找到比temp小得值(下标为j)。
while(arr[++i] <= temp) if(i == right) break;
while(arr[--j] >= temp) if(left == j) break;
3)对找到得符合条件得下标i、j进行判断,若i > j则break;否则,交换值。
4)注意,不要忘记这里。在将区间遍历结束后,此时i >= j,j所指向得必然是比temp小得值,交换下标j和left对应得值。
5)return j,j将下次快排分为两部分。
第四步:完善第二步。上面提过第三步是实现第二步得基础,通过第三步返回得j,将数组[left,right]分为[left,j-1]和[j+1,right]。对新的到得区间继续快排。
public void quickSort(int[] arr,int left,int right){
if(left >= right){
return;
}
int j = partition(arr,left,right);
quickSort(arr,left,j-1);
quickSort(arr,j+1,right);
}
完整代码如下:我没有将swap()交换值功能单拎出来,但是拎出来更好得。
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){
return;
}
int j = partition(arr,left,right);
quickSort(arr,left,j-1);
quickSort(arr,j+1,right);
}
public int partition(int[] arr,int left,int right){
int i = left,j = right+1;
int temp = arr[left];
while(true){
while(arr[++i] <= temp) if(i == right) break;
while(arr[--j] >= temp) if(left == j) break;
if(i >= j){
break;
}
int ex1 = arr[i];
arr[i] = arr[j];
arr[j] = ex1;
}
int ex2 = arr[left];
arr[left] = arr[j];
arr[j] = ex2;
return j;
}