快速排序
快速排序
思路
-
给定一个数组,将最左边(或最右边)的数定义为基准数,再给两个指针遍历这个数组。
-
在满足左边指针不等于右边指针的情况下遍历数组;
-
先从右边开始遍历,当左边指针小于右边指针且数组元素小于基准数,则停下;
-
再从左边开始遍历,当左边指针小于右边指针且数组元素大于基准数,则停下;
-
交换两个数的值;
-
-
当左边指针与右边指正相等时,两个指针相遇,交换基准数与相遇指针位置数组元素的值,此时基准数左边的数都比基准数小,基准数右边的值都比基准数大;
-
然后对左边进行递归的快速排序;
-
对右边进行递归的快速排序。
代码实现
public class QuickSort {
public static void main(String[] args) {
int[] arr = {-9, 78, 0, 23, -567, 70};
quickSort(arr,0, arr.length-1);
System.out.println(Arrays.toString(arr));
}
private static void quickSort(int[] arr, int left, int right) {
//进行判断,如果左边索引比右边索引要大,是不合法的,直接使用return结束这个方法
if (left > right) {
return;
}
int base = arr[left];//定义基准数
int i=left;//定义左指针
int j=right;//定义右指针
int temp;
//在i和j不相等的时候,再循环中进行检索
while (i!=j){
//先从右边寻找比基准数小的数,如果检索到就停下
while (arr[j] >= base && i<j) {
j--;
}
while (arr[i] <= base && i<j) {
i++;
}
//交换顺序
temp = arr[i];
arr[i] = arr[j];
arr[j]=temp;
}
//如果while循环的条件不成立,则代表i=j,相遇;交换基准数与相遇位置的元素;
arr[left] = arr[i];
arr[i] = base;
//排左边
quickSort(arr,left,j-1);
//排右边
quickSort(arr,j+1,right);
}
}

浙公网安备 33010602011771号