快速排序

    科技2022-08-17  101

    快速排序的核心思想(升序):从一个数组里面随意选取一个数作为基准数,将比基准数小的放在基准数的左边、比基准数大的放在基准数的右边,然后再对分成的左右两边进行同样的递归处理,最终达到数组有序

    package sort; import java.util.Arrays; public class QuickSort { public static void main(String[] args) { int[] arr = {3, -1, 6, 24, -13, 9, 42}; quickSort(arr, 0, arr.length - 1); System.out.println(Arrays.toString(arr)); } public static void quickSort(int[] arr, int left, int right) { int l = left, r = right, temp; // 定义左索引、右索引与临时变量temp int pivot = arr[(left + right) / 2]; // 定义基准值 // l索引向右找出大于基准值的数,直到基准值本身 // r索引向左找出小于基准值的数,直到基准值本身,因此定义该while循环用于控制程序的结束 while (l < r) { // 内循环(1) while (arr[l] < pivot) { l++; } // 内循环(2) while (arr[r] > pivot) { r--; } // l向右寻找,r向左寻找,可能最多可能找到pivot值本身,那时也直接说明 // 以基准值为中心,左边的值都是小于pivot,右边的值都是大于pivot,那么两边已经满足条件,可以直接退出 if (l == r) { break; } // 找到之后交换彼此的值 temp = arr[l]; arr[l] = arr[r]; arr[r] = temp; // 数值交换后,l索引的值可能会和pivot的值相等,那么一遇到内循环(1)便会结束 // 但是r索引的值可能最多只是找到pivot本身,那么r便一直大于l,外层循环永不结束 // 因此定义该if条件,结束外层循环 if (arr[l] == pivot) { r--; } // 同上r索引也是如此 if (arr[r] == pivot) { l++; } } // 防止栈溢出 if (l == r) { l++; r--; } // 向左递归,使左半部分有序 if (left < r) { quickSort(arr, left, r); } // 向右递归,使右半部分有序 if (right > l) { quickSort(arr, l, right); } } }

    效果如图: 若想实现降序,将内循环1、2的判断条件取反即可(不包括等于)

    Processed: 0.013, SQL: 9