《快速排序》——Java实现
快速排序的平均时间复杂度是O(n log n)。
一开始随机挑选一个基准值,这里固定选的是数组第一个元素,然后有左右两个指针,分别向中间开始靠拢,过程中,左指针遇到比基准值大的,那就和右指针交换,相同的右指针也是,左右交替进行,在左右指针相遇的地方,也就是基准值所在的地方,这时候基准值的左侧都比基准值小,右侧都比基准值大,然后以基准值的位置进行拆分,然后两个小数组重复上面过程。
其实左右指针的目的就是,快速扫描整个数组,以基准值为标准将其分成两部分,拆分到最后,整个数组就已经是有序的了。
1 public class QuickSort implements IArraySort{ 2 3 @Override 4 public int[] sort(int[] arr) { 5 // 复制数组,不对入参修改 6 int[] newArr = Arrays.copyOf(arr, arr.length); 7 partition(newArr,0,newArr.length - 1); 8 return newArr; 9 } 10 11 private void partition(int[] arr, int left, int right) { 12 13 if (left >= right) return; 14 15 // 设定基准值(pivot) 16 int temp = arr[left]; 17 int l = left; 18 int r = right; 19 20 while (l < r){ 21 //右指针扫描 22 while ( l < r && arr[r] >= temp){ 23 r--; 24 } 25 26 arr[l] = arr[r]; 27 // 左指针扫描 28 while ( l < r && arr[l] <= temp){ 29 l++; 30 } 31 32 arr[r] = arr[l]; 33 34 } 35 36 arr[l] = temp; 37 38 partition(arr,left,l-1); 39 partition(arr,l + 1,right); 40 } 41 42 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?