java面(笔)试题:实现快速排序(java)

实现快速排序

  • 例输入:{6 ,1 , 2 ,7 , 9 , 8 , 4 , 5 ,10 , 8}

算法大致思路

  • 算法总体思路如下:每一轮排序中,每次都以第一个元素作为标准,将小于其元素的数放在左边,大于其元素放在右边。也就是说每经过一次排序,都确定了第一个数位置,并且以该数为分界线,将该数组分成了两个小数组。再将这两个小数组分别进行刚刚的排序即可。

  • 算法过程:第一轮 双指针 begin = 0, end = 9, temp = N【begin】= 6

    • i = begin , j = end

    • 从右边 j 指针往左找第一个小于6的数——5

    • 从左边 i 指针往右找第一个大于6的数——7

    • 将 5 和 7 的位置进行互换 ——此时【6 ,1 , 2 ,5 , 9 , 8 , 4 , 7 ,10 , 8】

    • 再从右边 j 指针往左找第二个小于6的数——4

    • 再从左边 i 指针往右找第二个大于6的数——9

    • 将 9 和 4 的位置进行互换——此时【6 ,1 , 2 ,5 , 4 , 8 , 9 , 7 ,10 , 8】

    • 再从右边 j 指针往左找第三个小于6的数——4

    • 此时 j = 4 i = 4,所以结束第一轮的查找

    • 将 N【i】和 N【begin】进行互换——此时【4 ,1 , 2 ,5 , 6 , 8 , 9 , 7 ,10 , 8】

  • 下一轮只需要将左右两个数组进行同样的操作即可!

实现

  • 第一:一定是先从右边开始找,右指针先动,因为我们要确保最后找到的数一定是小于temp的
  • 第二:在指针寻找的时候,比较 temp 时等于号也是要的,因为不加等于号那么在遍历到等于temp的数时也会停止
  • 第三:在指针寻找的时候,必须要有 i < j 的判断条件
public static void quickSort(int[] nums,int begin, int end){

    if(begin > end) return;
    int temp = nums[begin];
    int i = begin;
    int j = end;
    while(i < j){

        //等于号不能丢 并且 一定是先从右边开始找 因为最后交换的数一定是小于等于基准数的的
        while(nums[j] >= temp && i < j){ //从右边开始找
            j--;
        }

        while(nums[i] <= temp && i < j) { //从左边开始找
            i++;
        }



        if( i < j){ //进行交换
            int tempx = nums[i];
            nums[i] = nums[j];
            nums[j] = tempx;
        }

    }

    nums[begin] = nums[i]; //这里一定用i 因为i一定是小于numsp[begin]的
    nums[i] = temp;

    quickSort(nums,begin,i- 1);
    quickSort(nums,i+1,end);


}

总结

  • 实现这个要对快排有一个深入的了解,总体架构就是一个while大循环 里面有两个while小循环,分别是右指针和左指针的遍历
  • 然后while大循环的内外各有两次元素交换!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值