十大排序之归并排序

算法思想

该算法采用分治法(divide and conquer),作为一种典型的分而治之的思想,归并法的排序可以通过自下而上进行递归,也可以通过自底向上迭代来完成

通过递归算法

/*
 * @Descripttion: 
 * @version: 
 * @Author: 秀玉轩晨
 * @Date: 2021-09-27 16:26:57
 * @LastEditors: 秀玉轩晨
 * @LastEditTime: 2021-09-27 21:02:48
 */
using namespace std;
#include <iostream>
#include <vector>

class MergeSort {
  public:
    void merge(vector<int> &array, int left, int middle, int right) {
      //low为第1有序区的第1个元素,i指向第1个元素, mid为第1有序区的最后1个元素
      int i = left, j = middle + 1, k = 0;
      // 设置临时数组
      vector<int> temp(right - left + 1);
      while(i <= middle && j <= right) {
        if (array[i] <= array[j]) {
          temp[k++] = array[i++];
        } else {
          temp[k++] = array[j++];
        }
      }
      //若比较完之后,第一个有序区仍有剩余,则直接复制到t数组中
      while(i <= middle) {
        temp[k++] = array[i++];
      }
      // 同上
      while(j <= right) {
        temp[k++] = array[j++];
      }
      //将排好序的存回arr中low到high这区间
      for (i = left, k = 0; i <= right; i++,k++) {
        array[i] = temp[k];
      }

      vector <int>().swap(temp);  //清除容器并最小化它的容量
    }
    
    void mergeSort(vector<int> &array, int left, int right) {
      if(left >= right){
        return;
      }
      // 选取中间位置对数组分割
      int middle = (left + right) /2;
      mergeSort(array, left, middle);
      mergeSort(array, middle + 1, right);
      // 开始进行合并排序
      merge(array, left, middle, right);
    }
};

int main() {
  vector<int> arr = {4,1,4,5,1,7,3,9,0,5};
  MergeSort sort;
  sort.mergeSort(arr, 0 , arr.size() -1 );
  for (int i = 0; i < arr.size(); i++)
		cout << arr[i] << "  ";

	cout << endl;
  return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值