java基础算法-快速排序

玩博客园很多年,第一次写点什么,就从基础开始吧。最近去面试,发现自己算法忘光了,赶紧复习下。以下代码自带测试类,复制进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 }
复制代码

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值