归并排序

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

算法步骤:

      1、申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列

      2、设定两个指针,最初位置分别为两个已经排序序列的起始位置

      3、比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

      4、重复步骤3直到某一指针达到序列尾

      5、将另一序列剩下的所有元素直接复制到合并序列尾

代码:

#include 
   
   
    
      
using namespace std;  
template 
    
    
     
       
void MSort(T a[], int left, int right)  
{  
      if (left < right)  
      {  
            int center = (left + right) / 2;//取得中点  
            //将原来序列分为两段  
            MSort(a, left, center);  
            MSort(a, center+1, right);  
            //合并刚才分开的两段,得到原来序列的有序序列  
            Merge(a, left, center, right, right-left+1);  
      }  
}  
  
template 
     
     
      
        
void MergeSort(T a[], int n)  
{  
    //调用递归归并排序函数  
      MSort(a, 0, n-1);  
}  
template 
      
      
       
         
void Merge(T a[], int left, int center, int right, int n)  
{  
      T *t = new T[n];//存放被排序的元素  
      int i = left;  
      int j = center + 1;  
      int k = 0;  
      //合并数组,用插入排序,如果左边大就插入左边的数,右边的计数器等待,与下一个左边的数比较;右边大就插入右边的数,左边的计数器等待,与下一个右边的数比较(这里指的插入是插入到新数组t[])  
      while (i<=center && j<=right)  
      {  
            if (a[i] <= a[j])  
                  t[k++] = a[i++];  
            else  
                  t[k++] = a[j++];  
      }  
      //上面的步骤在执行完后,左或右边都有可能剩余若干个元素,而另一边的元素肯定已全部复制到新数组,这时需要特殊对待剩下的元素  
      if (i == center+1)  
      {  
            while (j <= right)  
                  t[k++] = a[j++];  
      }  
      else  
      {  
            while (i <= center)  
                  t[k++] = a[i++];  
      }  
      //把t[]的元素复制回a[]中left到right段  
      for (i=left,k=0; i<=right; i++,k++)  
            a[i] = t[k];  
      //释放内存  
      delete []t;  
}  
int main()  
{  
    int intArray[5] = { 5 , 6 , 2 , 5 , 9 };  
    MergeSort(intArray,5);  
    for(int i = 0; i < 5; i++)  
    cout << intArray[i] << endl; 

	system("pause");
	return 0;
}  
      
      
     
     
    
    
   
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gz7seven

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值