侧边栏壁纸
博主头像
buukle博主等级

布壳儿

  • 累计撰写 106 篇文章
  • 累计创建 15 个标签
  • 累计收到 9 条评论

目 录CONTENT

文章目录

算法练习(22) - 快排:原址排序

administrator
2022-03-10 / 0 评论 / 0 点赞 / 450 阅读 / 1454 字

1. 思路

将一个数组的最后一位数字(a[q])作为"元",从头a[p]开始跟这个数字比较(索引从i(i=p)开始),使用一个变量作为指针(point) , 如果a[i] 小于 a[q] ,将其与a[point] 互换; 同时 point 向前移动(point++),这样使得比"元"小的数值都放到了a[p] ~ a[point] 之中; 最后将 a[point+1] 与a[q]互换,最后的结果就是以a[point+1] 为界, 左边全小于"元",右边全大于"元";最后左右两边递归调用以上方法即可完成原址排序

2. code

public class QuickSortTest {

    @Test
    public void quickSort_test() {
        int[]  a = {1,9,3,4,7,2,9,10,14,16};
        quickSort(a,0,a.length-1);

        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i]);
            System.out.print(",");
        }
    }

    private void quickSort(int[] a, int p, int q) {
       if(p<q){
           int r = partition(a,  p,  q);
           quickSort(a,p,r-1);
           quickSort(a,r+1,q);
       }
    }

    private int partition(int[] a, int p, int q) {

        int x = a[q];
        int point = p-1;
        for (int i = p; i < q; i++) {
            if(a[i] < x){
                point ++;
                int temp = a[i];
                a[i] = a[point];
                a[point] = temp;
            }
        }

        int temp = a[point+1];
        a[point + 1 ] = a[q];
        a[q] = temp;
        return point +1;
    }

}

3. 复杂度分析

递归调用,复杂度记为$O(lgn)$ ,每次partition 为$O(n)$ , 整体复杂度为 $O(nlgn)$
当然,这个值并不准确,在极端坏的情况下为$O(n^2)$ ,极端好的情况下为$O(lgn)$

0

评论区