嗷嗷嗷
今天晚上看面经的时候刷到了快排,就把快排的具体细节实现来分享一下:
public class 快排 {
public static void main(String[] args) {
int[] a = {12,20,5,16,15,1,30,45,23,9};
int left=0;
int right=a.length-1;
System.out.println(Arrays.toString(quickSort(a, left, right)));
}
private static int[] quickSort(int[] a, int start, int end) {
int left=start;
int right=end;
if(left>=right){
return a;
}
int pivotIndex = partition(a,start,end);
quickSort(a,start,pivotIndex-1);
quickSort(a,pivotIndex+1,end);
return a;
}
private static int partition(int[] a, int start, int end) {
int left=start;
int right=end;
//取第一个元素为基准元素
int pivot = a[left];
while (left!=right){
while (left<right&&a[right]>pivot) {
//从最右边开始,一直找到右边第一个比基准值小的数据
right--;
}
while (left<right&&a[left]<=pivot){
//从左边开始,一直找到左边比基准值大的数据
left++;
}
if(left<right){
int t=a[left];
a[left]=a[right];
a[right]=t;
}
}
//pivot和指针重合点交换
int t=a[left];
a[left]=a[start];
a[start]=t;
return left;
}
}
每一步的具体过程如下:"[""]"符号代表已经到位的数据
第一次:
12,20,5,16,15,1,30,45,23,9
left(pivot) right
12,9,5,16,15,1,30,45,23,20
pivot
(left) right
12,9,5,16,15,1,30,45,23,20
pivot left right
12,9,5,1,15,16,30,45,23,20
pivot left right
12,9,5,1,15,16,30,45,23,20
pivot left(right)
第二次:
1,9,5,12,15,16,30,45,23,20
1, 9, 5, [12] 15 16, 30, 45, 23, 20
pivot(left) right pivot(left) right
1, 9, 5, [12] 15 16, 30, 45, 23, 20
pivot(left/right) pivot(left/right)
第三次:
[1] 9, 5, [12],[15] 16, 30, 45, 23, 20
pivot(left) right pivot(left) right
[1] 5, 9, [12],[15] 16, 30, 45, 23, 20
pivote(left/right) pivot(left/right)
第四次:
[1],[5],[9],[12],[15],[16], 30, 45, 23, 20
pivot(left) right
[1],[5],[9],[12],[15],[16], 30, 45, 23, 20
pivot(30) left right
[1],[5],[9],[12],[15],[16], 30, 20, 23, 45
pivot left(right)
[1],[5],[9],[12],[15],[16], 30, 20, 23, 45
pivot
第五次:
[1],[5],[9],[12],[15],[16], 30, 20, [23],45
pivot(left) right pivot(left/right)
[1],[5],[9],[12],[15],[16], 20, 30, [23],45
pivot(left/right) pivot(left/right)
[12],[20],[5],[16],[15],[1],[30],[45],[23],[9]