快速排序
Posted hejunhong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序相关的知识,希望对你有一定的参考价值。
//判断a是否小于b private static boolean less(Comparable v, Comparable w) { return v.compareTo(w) < 0; } //两个交换 private static void swap(Comparable arr[], int i, int j) { Comparable tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } //进行数组中的排序 private static void sort(Comparable arr[]) { //第一个数的索引 int low = 0; //最后一个数的索引 int high = arr.length - 1; sort(arr, low, high); } //对arr数组中 low到high进行排序 private static void sort(Comparable arr[], int low, int high) { //要排序的子数组,low比high都大了 说明 该数组只剩一个值,无法在交换了 if (high<=low){ return; } //需要对数组中low-high 中的元素进行分组,分为左子组,右子组 int partition = partition(arr, low, high); //返回分界的那个值的索引 //让左子组有序 sort(arr, low, partition - 1); //让右子组有序 sort(arr, partition + 1, high); } //进行分组的方法 private static int partition(Comparable arr[], int low, int high) { //确定分界值 Comparable key = arr[low]; //定义两个指针,指向待切分数组的最小索引和最大索引 int left = low; int right = high + 1; //切分 需要进行扫描 扫描多少次呢 使用 while (true) { //先从右往左扫描,移动right指针,找到一个比分界值小的元素,停止 //元素比分界大,不是目标元素,指针就一直左移, while (less(key, arr[--right])) { //如果到了最左边也没找到,退出 if (right == low) { break; } } //在从左往右扫描,移动left指针,找到一个比分界值大的元素,停止 //向右移动 找比key大的值 while (less(arr[++left], key)) { //如果到了最左边也没找到,退出 if (left == high) { break; } } //判断left》=right,如果是 元素扫描完毕结束循环 if (left >= right) { //说明扫描完毕了 break; } else { //没有扫描完,说明 比key 大的和比key小的 都需要交换位置 swap(arr, left, right); } } //整个循环结束 找到了分界值的索引 ,将基准与分界值的位置换掉,交换分界值 swap(arr, low, right); return right; } public static void main(String[] args) { Integer[] integers= {6, 1, 2, 7, 9, 3, 4, 5, 8}; sort(integers); System.out.println(Arrays.toString(integers)); }
以上是关于快速排序的主要内容,如果未能解决你的问题,请参考以下文章