归并排序

本文介绍了归并排序的基本原理,分析了其O(N*LogN)的时间复杂度,并提供了详细的C++实现代码。虽然归并排序需要额外的空间,不适用于内部排序,但它在外部排序中有很好的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

归并排序是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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值