排序算法之快速排序

思路:

将数组的第一个元素作为基准值,右索引先从右到左找到比基准值小的,左索引从左到右找到比基准值大的,然后交换,一直到左索引和右索引相遇。再将相遇的那个值与基准值交换。那么基准值左边的都是比它小的,右边的都是比它大的。

 

以基准值为中轴将数组一分为二,继续上面的操作将两个子数组都变成基准值左边的都比它小,基准值右边的都比它大。然后再以基准值为中轴一分为二......因为交换是在原数组arr上进行的,当切分进行不下去的时候,数组也就排好了。

代码:

复制代码
 1     /**
 2      * 快速排序
 3      * @param arr   需排序的数组
 4      * @param left  数组最左边的下标
 5      * @param right 数组最右边的下标
 6      */
 7     public static void quickSort(int[] arr, int left, int right) {
 8         if (arr == null || arr.length == 0) {
 9             return;
10         }
11         if (left > right) {
12             return;
13         }
14         //基准值
15         int pivot = arr[left];
16         //左索引
17         int i = left;
18         //右索引
19         int j = right;
20         //临时变量
21         int temp;
22         //将左边比基准值大的与右边比基准值小的进行交换,直到i和j相遇为止
23         while (i != j) {
24             //右索引先开始查找比基准值小的,这样可以保证i和j相遇时,所指向的值会小于等于基准值
25             while (j > i && arr[j] >= pivot) {
26                 j--;
27             }
28             //左索引开始查找比基准值大的
29             while (i < j && arr[i] <= pivot) {
30                 i++;
31             }
32             //i和j相遇或者左索引找到了比基准值大的和右索引找到了比基准值小的,进行交换
33             temp = arr[i];
34             arr[i] = arr[j];
35             arr[j] = temp;
36         }
37         //i和j相遇,将它们指向的值与基准值进行交换
38         arr[left] = arr[i];
39         arr[i] = pivot;
40         //当前数组以基准值为中轴,左边都比pivot小,右边都比pivot大
41         //以基准值为中轴,将当前数组切成两个子数组进行递归排序
42         quickSort(arr, left, i - 1);
43         quickSort(arr, i + 1, right);
44     }
复制代码

 

posted @   Java厨师长  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示