归并排序

归并排序

归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。

排序思想:

将序列每相邻两个数字进行归并操作(merge),形成floor(n/2)个序列,排序后每个序列包含两个元素

将上述序列再次归并,形成floor(n/4)个序列,每个序列包含四个元素

重复上述步骤,直到所有元素排序完毕

 

C++实现:

/****************************
 *Name:归并排序_递归.cpp
 *Tags:排序 递归 归并
 *Note:
 *****************************/
 
#include<iostream>
#define MAX_SIZE1000
using namespacestd;
 
template<typename Type> void MergeSort(Type *, int, int);
template<typename Type> void Merge(Type *, int, int, int);
 
int main()
{
      int len, i, array[MAX_SIZE];
      cout << "Input the Size of thearray: ";
      cin >> len;
      for(i = 0; i < len; i++) {
    cin>> array[i];
      }
      MergeSort(array, 0, len-1); //归并操作
      cout << "After Sort: "<< endl;
      for(i = 0; i < len; i++) {
    cout<< array[i] << " ";
      }
      cout << endl;
      return 0;
}
 
template<typename Type>
voidMergeSort(Type *array, int start, int end)
{
      if(start < end) {
    intmiddle = (start + end) / 2;
   MergeSort(array, start, middle); //归并排序
   MergeSort(array, middle+1, end);
   Merge(array, start, middle, end); //归并操作
      }
}
 
template<typename Type>
void Merge(Type*array, int start, int middle, int end)
{
      int i, j, t;
      Type *temp = new Type[end-start+1];
      i = start;
      j = middle+1;
      t = 0;
      while(i <= middle && j <=end) {
    if(array[i] < array[j]) {
            temp[t++] = array[i];
            i++;
    }else {
            temp[t++] = array[j];
            j++;
    }
      }
      while(i <= middle) {
   temp[t++] = array[i++];
      }
      while(j <= end) {
   temp[t++] = array[j++];
      } //归并过程
      for(i = 0; i < t; i++) {
   array[i+start] = temp[i];
      }
      delete [] temp;
}    


归并排序的速度次于快速排序,但是它是一个稳定的排序算法。归并排序的时间复杂度为O(nlogn),它的最好,最坏,平均时间复杂度一样,空间复杂度为O(n),主要是在归并操作时需要额外的空间。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值