排序算法之快速排序
思路:
将数组的第一个元素作为基准值,右索引先从右到左找到比基准值小的,左索引从左到右找到比基准值大的,然后交换,一直到左索引和右索引相遇。再将相遇的那个值与基准值交换。那么基准值左边的都是比它小的,右边的都是比它大的。
以基准值为中轴将数组一分为二,继续上面的操作将两个子数组都变成基准值左边的都比它小,基准值右边的都比它大。然后再以基准值为中轴一分为二......因为交换是在原数组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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?