归并排序

13 篇文章 0 订阅

1、归并排序算法描述:

归并 排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路 归并
归并过程为:取待排序区间a[left~right]的中间点mid作为分隔点,将中间点左边序列(left~mid)用i索引,右边序列(mid+1~right)用j索引,比较a[i]和a[j]的大小,若a[i]≤a[j],则将左边有序表中的元素a[i]复制到临时数组tmp[k](大小为right-left+1)中,并令i和k分别加上1;否则将右边有序表中的元素a[j]复制到tmp[k]中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,然后再将另一个有序表中剩余的元素复制到tmp中从下标k到下标right-left的单元。递归该过程,即是归并排序。
2、归并排序算法实现:

#include <iostream>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
//递归实现归并排序
void mergeSort(int theArray[], int low, int high) 
{
	if(low >= high)
		return;
	int mid = (low + high) / 2;
	
	mergeSort(theArray, low, mid);                 //使得mid左边有序,包括mid 
	mergeSort(theArray, mid+1, high);              //使得mid右边有序 
	
	int tmpArray[high - low + 1];                  //临时数组,大小是high-low+1 
	int k;
	int i = low;
	int j = mid+1;
	k = 0;
	while(i <= mid && j <= high)
	{
		if(theArray[i] <= theArray[j])
		{
			tmpArray[k++] = theArray[i++]; 
		}
		else if(theArray[i] > theArray[j])
		{
			tmpArray[k++] = theArray[j++];
		}
	}

	while(j <= high)
		tmpArray[k++] = theArray[j++];
	while(i <= mid)
		tmpArray[k++] = theArray[i++];
	
	for(k = 0, i=low; k <= high-low, i <= high;)    //将临时数组中已经排好顺序的序列映射到theArray的low~high段 
	{                                              //使得theArray数组中low~high段有序 
		theArray[i++] = tmpArray[k++];
	}
}

void printArray(int theArray[], int n)
{
	if(theArray == NULL)
		return;
	for(int i = 0; i < n; ++i)
	{
		std::cout << theArray[i] << " ";
	}
	std::cout << std::endl;
}

int main(int argc, char *argv[]) {
	int myArray[] = {23, 18, 5, 78, 22, 33, 54, 9, 7};
	int length = sizeof(myArray) / sizeof(myArray[0]);
	mergeSort(myArray, 0, length-1);
	printArray(myArray, length);
	return 0;
}

3、算法时间复杂度和空间复杂度

归并排序的最好、最坏、平均时间复杂度均是O(nlogn).

空间复杂度是O(n),因此占用的空间较多。





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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值