归并排序

归并排序是O(N*LogN)时间复杂度,缺点是需要附加空间,对于内存的消耗是别的算法的两倍。

所以在内部排序并不是首选的算法,快速排序好像是更好的选择。但在外部排序中归并排序是不错的选择。

 

#include "stdafx.h"
#include "stdio.h"

void Merge(int A[], int tem[], int leftpos, int rightpos, int rightend)
{
 int i, leftend, count, tempos;

 leftend = rightpos - 1;
 tempos = leftpos;
 count = rightend - leftpos + 1;

 //合并数据到附加空间
 while( leftpos <= leftend && rightpos <= rightend )
 {
  if( A[leftpos] < A[rightpos] )
   tem[tempos++] = A[leftpos++];
  else
   tem[tempos++] = A[rightpos++];
 }

 //拷贝剩余数据到附加空间
 while( leftpos <= leftend )
  tem[tempos++] = A[leftpos++];

 while( rightpos <= rightend )
  tem[tempos++] = A[rightpos++];

 //将附加空间的数据拷贝回数列
 for( i = 0; i < count; i++, rightend-- )
  A[rightend] = tem[rightend];
}

void MSort(int A[], int tem[], int left, int right)
{
 int center;

 if( left < right )
 {
  center = (left + right) / 2;//二分数列
  MSort(A, tem, left, center);//递归调用
  MSort(A, tem, center+1, right);//递归调用
  Merge(A, tem, left, center+1, right);//合并分治
 }
}

void MergeSort(int A[], int count)
{
 int *tem = NULL;
 tem = (int*)malloc(count * sizeof(int)); //耗费附加空间

 if( tem != NULL )
 {
  MSort(A, tem, 0, count-1);
  free(tem);
 }
}

int _tmain(int argc, _TCHAR* argv[])
{
 int A[] = {23, 43, 76, 12, 8, 98, 76, 37};
 int count = sizeof(A) /  sizeof(A[0]);

 MergeSort(A, count);

 for( int i = 0; i < count; i++ )
  printf("%d  ", A[i]);
 
 return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值