快速排序
方法:
1,设置一个基准数,一般是数组(int [] arr)的最左边的那个数,不能仅仅理解为是arr[0];
2.检索,先从右边开始检索,遇到比基准数小的,就停下来;
再从左边开始检索,遇到比基准数大的,就停下来;
3.交换,将左右两边的元素交换
4.继续检索
5.当左右两边相遇,就将基准数和相遇位置的元素交换;
6.结束第一轮排序
7.继续排基准数左边的数组,然后排右边的数组
下面是实现代码:
package Sort.Search;
public class QuitSort2 {
public static void main(String[] args) {
int[] arr= {4,5,6,2,9,8,3};
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
quickSort(arr,0,arr.length-1);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
public static void quickSort(int[] arr, int left, int right) {
if(left > right){ //没有这段会出现下标越界
return;
}
int base = arr[left]; //定义一个基准数,
int i = left;
int j = right;
while(i != j){
while(i < j &&arr[j] >= base ){//从数组右边开始检索,比基准数大或者相等,则继续从右向左移动
j--; //j从右向左移动
}
while(i< j &&arr[i] <= base ){//从数组左边向右开始检索,大于或者小于基准数,则继续向右移动
i++;//i从左向右移动
}
//当i和j 都停止了循环,说明arr[j]小于基准数,arr[i]大于基准数
//将arr[i]和arr[j]交换
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//当i和j相等时,跳出循环
//将arr[left]和arr[i]或者arr[j]交换
arr[left] = arr[i];
arr[i] = base;
//第一轮循环结束,经行下一轮排序
quickSort(arr,j+1,right);//从基数的右边开始排序
quickSort(arr,left,i