快速排序流程

  1. 我们假设初始序列为 a[12,3,8,6,1,56,9,35,10],长度为9;
  2. 这里我用f指向第一个元素,l指向最后一个元素。f->a[0]=12、l->a[8]=10;
  3. 指向尾端的指针前移,首先判断l指向的值,即10小于第一个值12,l不移动;
  4. l停住之后,f开始向后移动寻找比12大的第一个遇到的值,即当f->a[5]=56时停住;
  5. 此时l和f都已停住,此时交换f和l指向的两个值,序列由原来的a[12,3,8,6,1,56,9,35,10]变为a[12,3,8,6,1,10,9,35,56],值变了但是f和l指向的位置不变;
  6. 第一次比较完仍然是l先移动,即回到第三步,当l->a[6]=9时,l遇到了第二个小于12的值,l停住;
  7. 回到第四步,f开始移动,当f->a[6]=9时f未找到比12大的值但是f和l碰面了,所以f也停住;
  8. 回到第五步,交换12和两个指针相遇的值,序列由a[12,3,8,6,1,10,9,35,56]变为a[9,3,8,6,1,10,12,35,36];
  9. 两个指针重合的地方是a[6]=12,现在以12为中点不动,前后分为两个数组继续排序即左边[9,3,8,6,1,10]右边[35,36];
  10. 继续第三到第九步分别排序左边和右边的序列;

        左边序列[9,3,8,6,1,10]:

        第一遍:[1,3,8,6,9,10]此时又以9为中点分为左边[1,3,8,6]右边[10]

        第二遍:[1,3,8,6]f和l相遇在1,所以要以1为中点右边[3,8,6]

        第三遍:[3,8,6]f和l相遇在3,所以要以3为中点右边[8,6]

        第四遍:[8,6]排序后[6,8]至此左边已排好为[1,3,6,8,9,10]

        第五遍:[35,36]已排好,所以最终排好序的结果为a[1,3,6,8,9,10,12,35,36]。

        java实现:

public class Main {
    public static void main(String[] args) {
        int aa[] = new int[] { 12, 3, 8, 6, 1, 56, 9, 35, 10 };
        sort(aa, 0, 8);
        for (int a : aa) {
            System.out.println(a + ",");
        }

    }

    public static int getHigh(int[] list, int low, int high) {

        int f, l, temp, t;
        temp = list[low];
        while (low != high) {
            while (list[high] > temp && high > low) {//从最后向前移动对应第三到第六步
                high--;
            }
            t = list[high];
            while (list[low] < temp && high > low) {//从前向后移动对应第七步
                low++;
            }
            list[high] = list[low];
            list[low] = t;
        }//一个循环结束排好第一次f和l相遇

        return high;
    }

    public static void sort(int[] array, int low, int high) {
        if (low >= high) {
            return;
        }
        int iHigh = getHigh(array, low, high);
        sort(array, low, iHigh- 1);//递归排一次结束之后中点左边的序列
        sort(array, iHigh+ 1, high);//递归排一次结束之后中点右边的序列
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值