快速排序与归并排序(分治算法实现)

  • 快速排序

    void quick_sort(int q[], int l, int r)
    {
        //递归的终止情况
        if(l >= r) return;
        //第一步:分成子问题
        int i = l - 1, j = r + 1, x = q[l + r >> 1];
        while(i < j)
        {
            while(q[++i] < x);
            while(q[--j] > x);
            if(i < j) swap(q[i], q[j]);
        }
        //第二步:递归处理子问题
        quick_sort(q, l, j), quick_sort(q, j + 1, r);
        //第三步:子问题合并.快排这一步不需要操作,但归并排序的核心在这一步骤
    }
    
  • 归并排序

    void merge_sort(int q[], int l, int r)
    {
        //递归的终止情况
        if(l >= r) return;
    
        //第一步:分成子问题
        int mid = l + r >> 1;
    
        //第二步:递归处理子问题
        merge_sort(q, l, mid ), merge_sort(q, mid + 1, r);
    
        //第三步:合并子问题
        int k = 0, i = l, j = mid + 1, tmp[r - l + 1];
        while(i <= mid && j <= r)
            if(q[i] <= q[j]) tmp[k++] = q[i++];
            else tmp[k++] = q[j++];
        while(i <= mid) tmp[k++] = q[i++];
        while(j <= r) tmp[k++] = q[j++];
    
        for(k = 0, i = l; i <= r; k++, i++) q[i] = tmp[k];
    }
    
  • 例题

    • 寻找逆序对

      //事实上大体与归并排序完全相同
      int t = 0;
      void merge_sort(int q[], int l, int r) {
          //递归的终止情况
          if (l >= r) return;
      
          //第一步:分成子问题
          int mid = l + r >> 1;
      
          //第二步:递归处理子问题
          merge_sort(q, l, mid), merge_sort(q, mid + 1, r);
      
          //第三步:合并子问题
          int k = 0, i = l, j = mid + 1, tmp[r - l + 1];
          while (i <= mid && j <= r)
              if (q[i] <= q[j]) tmp[k++] = q[i++];
              else {
                  tmp[k++] = q[j++];
                  t+=mid-i+1;//当右区间的值入列时,说明左区间后所有值都大于该值,均为逆序对
              }
          while (i <= mid) tmp[k++] = q[i++];
          while (j <= r) tmp[k++] = q[j++];
      
          for (k = 0, i = l; i <= r; k++, i++) q[i] = tmp[k];
      }
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值