玩博客园很多年,第一次写点什么,就从基础开始吧。最近去面试,发现自己算法忘光了,赶紧复习下。以下代码自带测试类,复制进eclipse中右键 run as --》java application 即可。控制台清晰打印出快排的过程。
1 package test; 2 3 4 /** 5 * 6 * 排序算法测试类 7 * 8 */ 9 public class TestForSort { 10 11 /** 12 * @param args 13 */ 14 public static void main(String[] args) { 15 int[] array = new int[] {4,1,5,3,2,6}; 16 //快排 17 quicksort(array,0,array.length-1); 18 System.out.println("=======最终========="); 19 for(int a:array){ 20 System.out.print(a); 21 } 22 } 23 24 /** 25 * 快速排序 26 * 27 * @param int n[] 要排序的数组 28 * @param left 排序开始下标 29 * @param right 排序结束下标 30 * @return 31 */ 32 static void quicksort(int n[], int left, int right) { 33 int dp; 34 if (left < right) { 35 dp = partition(n, left, right);//分治法,返回中轴下标 36 quicksort(n, left, dp - 1);//左边递归快排 37 quicksort(n, dp + 1, right);//右边递归快排 38 } 39 } 40 41 /** 42 * 快排核心算法,并返回中轴下标 43 * @param n 要分治的数组 44 * @param left 首位下标 45 * @param right 末位下标 46 * @return 47 */ 48 static int partition(int n[], int left, int right) { 49 50 //数组的第一个作为中轴(顺道保留了左值) 51 int pivot = n[left]; 52 System.out.println("==================排序前===================="); 53 System.out.println("中轴值="+pivot); 54 System.out.println("=======每次分治========= ,left="+left+",n[left]="+n[left]+",right="+right+",n[right]="+right+""); 55 //左<右才执行,即为一直到i=j时为止,此时ij碰撞的位置就是中轴 56 while (left < right) { 57 //找到第一个比中轴小的数n[rigth] 58 while (left < right && n[right] >= pivot){ 59 right--; 60 } 61 //把第一个比中轴小的输n[right]赋值给n[left],然后left右移一位 62 if (left < right){ 63 System.out.println("把n["+right+"]赋值给n["+left+"],left右移一位"); 64 n[left++] = n[right]; 65 } 66 //找到第一个比中轴大的数n[left] 67 while (left < right && n[left] <= pivot){ 68 left++; 69 } 70 //把第一个比中轴大的数n[left]赋值给n[right],并right左移一位 71 if (left < right){ 72 System.out.println("把n["+left+"]赋值给n["+right+"],right右移一位"); 73 n[right--] = n[left]; 74 } 75 } 76 //中轴赋值给最终左值(下一个递归的中轴下标) 77 n[left] = pivot; 78 System.out.println("==================排序后===================="); 79 System.out.println("中轴值="+pivot+"下标="+left); 80 System.out.println("left="+left+",n[left]="+n[left]+",right="+right+",n[right]="+right+""); 81 82 for(int a:n){ 83 System.out.print(a); 84 } 85 System.out.println(); 86 //返回中轴下标 87 return left; 88 89 } 90 }
------------------个人能力有限,大家多交流,一起壮哉我大JAVA!------------------
如果你觉得本文对你有点帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
【推荐】国内首个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速度为什么快?