常用排序代码解析--归并排序

归并排序:

归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治策略。将已有的子序列合并,得到完全有序的序列。即先使子序列有序,再使子序列段间有序。若将两个有序的表合并成一个有序表,称为二路归并。归并排序是一种稳定的排序方法。

算法步骤:

  1. 申请空间,使其大小为两个已排序序列之和,该空间用来存放合并后的序列
  2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置
  3. 比较两个指针所指向的元素,选择相对小的元素放入合并空间,并移动相对较小元素的指针到下一个位置
  4. 重复步骤3直到某一指针达到序列尾
  5. 将另一个序列剩下的所有元素直接复制到合并序列尾

代码实现:

C++代码实现:
      void merge(int numArry[],int left, int mid, int right){
             int i = left; //左序列指针;
             int j = mid + 1; //右序列指针;
             int k = 0; //临时序列指针;
             int *temp = new int[right - left + 1];
             while(i <= mid && j <= right){
                   if(numArry[i] <= numArry[j])
                       temp[k++] = numArry[i++];
                   else
                       temp[k++] = numArry[j++];
              }
       
              while(i <= mid){ //将左边未存储完的序列存入临时数组
                    temp[k++] = numArry[i++];
              }
       
              while(j <= right){ //将右边未存储完的序列存入临时数组
                     temp[k++] = numArry[j++]; 
               }
          
              k = 0;

              while(left <= right){
                     numArry[left++] = temp[k++];
              }
        delete []temp;

        }
   
        void merge_sort(int numArry[], int left,  int right){
              if(left < right){
                int mid = (right + left) / 2;

                merge_sort(numArry, left, mid);
                merge_sort(numArry, mid + 1, right);
       
                merge(numArry, left, mid, right);
               }
         }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值