快排归并排模板(含略详细的填坑注释说明)

#include<iostream>

using namespace std;
void quicksort(int arr[],int low,int high);
void mergesort(int *a,int l,int r,int *b); 

int main() {
	int nums[10] = {5,6,3,7,4,2,1,9,8,0};
	int b[10];
	mergesort(nums,0,9,b);
	for (int i = 0;i<=9;i++) {
		cout<<nums[i]<<' ';
	} 
	return 0;
}


void quicksort(int arr[], int low, int high){
    if (high <= low) return;
    int i = low;
    int j = high + 1;
    int key = arr[low];
    while (true)
    {
        /*从左向右找比key大的值*/
        while (arr[++i] < key)
        {
            if (i == high){
                break;
            }
        }
        /*从右向左找比key小的值*/
        while (arr[--j] > key)
        {
            if (j == low){
                break;
            }
        }
        if (i >= j) break;
        /*交换i,j对应的值*/
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
    /*中枢值与j对应值交换*/
    int temp = arr[low];//也就是说这个key值让右面的数组继续使用,而左边的数组重新启用一个新key值 
    arr[low] = arr[j];
    arr[j] = temp;
    quicksort(arr, low, j - 1);
    quicksort(arr, j + 1, high);
}

void mergesort(int *a,int l,int r,int *b){

         if(l>=r)

                  return ;

         int mid=l+r;

         mid/=2;

         mergesort(a,l,mid,b);      //左边有序

         mergesort(a,mid+1,r,b);  //右边有序

        

         int k=l,i=l,j=mid+1;                    //注意k的初值

         while(i<=mid&&j<=r){              //将i-mid和j-r两组有序序列,归并在一个有序序列中

                  if(a[i]<=a[j])

                          b[k++]=a[i++];

                  else

                          b[k++]=a[j++];

         }
//两个循环在一层递归中最终只有一个会运行 
         while(i<=mid)                            //将i-mid剩余的数放在最后

                  b[k++]=a[i++];

         while(j<=r)                                 //将j-r剩余的数放在最后

                  b[k++]=a[j++];

         for(k=l;k<=r;k++)                       //将b数组中的数据拷贝到原数组中

                  a[k]=b[k];

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值