快排
快排
-
何为快排:通过迭代跟中枢轴上的元素进行比较,有两种情况,用两个临时变量对数组一个从前遍历,一个从后遍历,当那个从前开始遍历的临时变量值1大于中枢轴的值时、且当那个从后开始遍历的临时变量值2小于中枢轴值时,两个临时变量存的数据进行互相交换。
-
思路:
-
声明中枢值key为下标0的元素
-
将left和right分别赋给l变量和r变量,为下面操作提供类似指针操作遍历
-
满足当l小于r时,l和r开始工作查找,先r(右边)遍历再l(左边)遍历查找
-
直到都工作完,交换数据
-
迭代
-
首先把l中的数据给了key做为新的中枢值
-
其次把原来的key的数据给了l,实现了数据交换
-
然后递归左部分进行排序:从left到l-1
递归右部分进行排序:从l+1到right
-
- 代码实现:
package com.guodaxia.quicksorts; /** * @ author Guo daXia * @ create 2022/11/14 */ public class QuickSorts { public static void main(String[] args) { System.out.print("原数组:["); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i]); System.out.print(" "); } System.out.println("]"); System.out.print("使用快排排序好的数组:["); quick(arr,0,arr.length-1); for (int i :arr) { System.out.print(i); System.out.print(" "); } System.out.println("]"); } //初始化数组 static int[] arr = new int[]{1,7,4,6,8,9,2,3}; //定义一个方法,用于实现快排 public static void quick(int[] arr, int left, int right){ //先解决掉一些限制,主要是现实限制 if (arr==null||arr.length==0){ return; } if (left>right){ return; } //声明枢轴:即中位数 int key = arr[left];//约定第一个元素 int l = left; //临时变量l用于遍历,下面r作用相同 int r = right; while (l!=r){//当l变量在r的左边,进行循环查找 while (arr[r]>=key&&l<r){//r变量从右找,直到找到值小于key值为止 r--; } while (arr[l]<=key&&l<r){//l变量从左找,直到找到值大于key值为止 l++; } //两个临时变量已经停下来了:arr[r]值小于key;arr[l]值大于key //可以交换两临时变量对应的数据\ if (l<r){ int temp = arr[l]; arr[l]= arr[r]; arr[r]=temp; } } //通过以上第一遍循环,实现了一次交换,数组分为两个小部分: //左边的值都小于key值,而右边的值都大于key值 //使用两个递归,各种实现通过新key值交换 arr[left]=arr[l];//将l中的数据给left, arr[l]=key;//将key的数据给l quick(arr,left,l-1);//左小部分 quick(arr,l+1,right);//右小部分 } }
比任何人都要努力
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)