yan061

导航

java快速排序

java快速排序是十大排序算法之一,面试经常会问,记录一下学习心得。对以下数组排序

 

首先我们取 li[0] 的值为基准temp。左边界为0,右边界为li.length -1 = 8

从右开始,和基准值作比较,如果小于等于基准值,则替换掉 li[0]的值,否则右边界-1

0 -1 35 44 -45 88 -99 55 55

 

 

两个55都是>0的,右边界-2=6,到了-99的时候小于0了,则替换 li[左边界] = li[右边界]

-99 -1 35 44 -45 88 -99 55 55

 

 

再从左开始如果大于基准值,则替换右边界的值,否则左边界+1。这里-99是小于基准的,所以+1=1.

li[1] = -1 < 0 所以左边界再+1.  li[2]=35 > 0 则替换右边界的值。

-99 -1 35 44 -45 88 35 55 55

 


再从右边开始找

-99 -1 -45 44 -45 88 35 55 55

 

 

再从左边找

-99 -1 -45 44 44 88 35 55 55

 

 

再从右边找,发现左边界=右边界时,赋值为temp

-99 -1 -45 0 44 88 35 55 55

 

 

这样我们第一个数的合适位置就找到了。

最后再把数组从0分为两个数组进行处理,

第一个数组左边界为0,右边界为3-1

第二个数组左边界为3+1,右边界为li.length-1

这样进行递归即可。

 

public static void soutHelp(int[] li) {
        for (int i = 0; i < li.length; i++) {
            System.out.print(li[i] + "\t");
        }
        System.out.println("");
    }


    public static void quick(int[] li, int l, int r) {
        if (l < r) {
            int temp, i, j;
            i = l;
            j = r;
            temp = li[l];
            while (i != j) {
                // 先从右边找到小于初始值的数
                while (i < j && li[j] >= temp) {
                    j--;
                }
                li[i] = li[j];
                // 再从左边开始找
                while (i < j && li[i] <= temp) {
                    i++;
                }
                li[j] = li[i];
            }
            li[i] = temp;
            quick(li, l, i - 1);
            quick(li, i + 1, r);
        }
    }


    public static void main(String[] args) {
        int[] li = {0, -1, 35, 44, -45, 88, -99, 55, 55};
        quick(li, 0, li.length - 1);
        soutHelp(li);
    }

  输出结果为: -99 -45 -1 0 35 44 55 55 88

要注意这儿判断的时候需要加上=,不然如果数组中有相同值的时候会进入死循环。

while (i < j && li[j] >= temp)

 

posted on 2022-01-06 22:11  yan061  阅读(58)  评论(0编辑  收藏  举报