一、快速排序
/** * 快速排序: * 把待排序的数组分为左右两个区间,左边的都比中间的基准数小,右边的都比中间的基准数大。 * 接着左右两边各自再做同样的工作,完成后再拆分继续,直到各区间只剩一个数为止。 */
public static void quicksort(Integer[] arr, int start, int end) {
if (start < end) {
//把数组的第一位当成基准数
int stand = arr[start];
//记录要进行排序的下标
int low = start;
int high = end;
//循环找到比基准数大的数和比基准数小的数
while (low < high) {
//先从右开始,右边的数要比基准数大
while (low < high && arr[high] >= stand) {
high--;
}
//使用右边的数替换左边的数
arr[low] = arr[high];
//再从左开始,左边的数要比基准数小
while (low < high && arr[low] <= stand) {
low++;
}
//使用左边的数替换右边的数
arr[high] = arr[low];
}
//把标准值赋值给下标重合的位置
arr[low] = stand;
//处理左边的小的数
quicksort(arr, start, low);
//处理右边的大的数
quicksort(arr, low + 1, end);
}
}
注意的点:
1.先从右开始移动指针
2.移动指针的条件,右边的数要大于或等于基准数 ,左边的数要小于等于,这样不会发生死循环
二、全部代码
public class _2_QuickSort {
public static void main(String[] args) {
Integer[] arr = {3, 5, 1, 7, 2, 3, 4, 8};
quicksort(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
}
public static void quicksort(Integer[] arr, int start, int end) {
if (start < end) {
//把数组的第一位当成基准数
int stand = arr[start];
//记录要进行排序的下标
int low = start;
int high = end;
//循环找到比基准数大的数和比基准数小的数
while (low < high) {
//先从右开始,右边的数要比基准数大
while (low < high && arr[high] >= stand) {
high--;
}
//使用右边的数替换左边的数
arr[low] = arr[high];
//再从左开始,左边的数要比基准数小
while (low < high && arr[low] <= stand) {
low++;
}
//使用左边的数替换右边的数
arr[high] = arr[low];
}
//把标准值赋值给下标重合的位置
arr[low] = stand;
//处理左边的小的数
quicksort(arr, start, low);
//处理右边的大的数
quicksort(arr, low + 1, end);
}
}
}