快速排序
1. 快速排序思想
int [] arr = {8,2,9,10,1,5,14,9};
left = 0
right = arr.length -1
首先在这个序列中随便找一个数作为基准数,为了方便,就让第一个数8作为基准数.
base = arr[left]
两端开始“探测”right先从右往左找一个小于base的数,
==》从右往左找一个小于base的数:停止在5的位置
再left从左往右找一个大于base的数
==》从左往右找一个大于base的数: 停止在9
最后交换它们
==》 8,2,5,10,1,9,14,9
第一次交换结束,接下来right继续向左挪动,发现1,left再从左往右找一个大于base的数,发现10,继续进行交换
交换后: 8,2,5,1,10,9,14,9
这个时候左右两边相等(left==right),第一次探测结束,将base放到结束位置
结果为: 2,5,1,8,10,9,14,9
此时以基准数base为分界点,base左边的数都小于等于base,base右边的数都大于等于base
基准数左边的:递归上面过程
基准数右边的:递归上面过程
2.编码实现
public class MyQuickSort {
public static void main(String[] args) {
int [] arr = {8,2,9,10,1,5,14,9};
quickSort(0,arr.length-1,arr);
for(int item: arr){
System.out.print(" "+ item);
}
}
public static int[] quickSort(int left ,int right,int [] arr){
int i,j,t,tem;
if(left > right)
return arr;
tem = arr[left];
i = left;
j = right;
while(i!=j){ //顺序很重要,要先从右边开始找
while(arr[j]>= tem && i < j){
j --;
}
while(arr[i]<=tem && i<j){ //先从左边开始找
i++;
}
if(i < j) { //交换两个数在数组中的位置
t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
// 最终将基准数归位
arr[left] = arr[i];
arr[i] = tem;
quickSort(left, i-1,arr);//继续处理左边的,这里是一个递归的过程
quickSort(i+1, right,arr);//继续处理右边的 ,这里是一个递归的过程
return arr;
}
}