快速排序和归并排序模板

快排模板:

public static void quick_sort(int[] q,int l,int r){
         if (l >= r) return;//数组长度为1或者0直接返回
        int x = q[l+r>>1];//取中间值为参考

        //Define positions of two pointers
        int i = l - 1;
        int j = r + 1;

        while (i < j) {
            do i++; while (q[i] < x);
            do j--; while (q[j] > x);
            //do Swap交换
            if (i < j) {
                int temp = q[i];
                q[i] = q[j];
                q[j] = temp;
            }
        }

        quick_sort(q, l, j);
        quick_sort(q, j + 1, r);
   }

这里之所以是do while循环是因为如果q[i]等于x,q[j]等于x时。两者互换,但是两者的i,j不改变没有进行++或者--,则一直卡在while循环中,死循环。循环的出口是当i>=j.

归并排序模板:

  private static void merge_sort(int[] arr, int l, int r) {
        // 递归结束条件
        if (l >= r) return;

        // 以下都为逻辑部分
        int mid = l + ((r - l) >> 1);
        merge_sort(arr, l, mid);
        merge_sort(arr, mid + 1, r);
        //此时有两个排好序的数组,要做的就是将他们合并
        int[] tmp = new int[r - l + 1]; // 临时数组, 用于临时存储 [l,r]区间内排好序的数据,长度刚好存下上面的两个数组
        int i = l, j = mid + 1, k = 0;  // 两个指针
        // 进行归并
        while (i <= mid && j <= r) {
            if (arr[i] <= arr[j]) 
                tmp[k++] = arr[i++];
            else
                tmp[k++] = arr[j++];
        }

        while (i <= mid) tmp[k++] = arr[i++];//前一个数组还有剩余
        while (j <= r) tmp[k++] = arr[j++];//后一个数组还有剩余

        // 进行赋值
        for (i = l, j = 0; i <= r; i++, j++)
            arr[i] = tmp[j];
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值