八大排序算法-归并排序

news/2024/5/17 18:13:37 标签: 归并排序, 排序算法

归并排序的定义:

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

归并排序的基本思想:

设r[i…n]由两个有序子表r[i…m]和r[m+1…n]组成,两个子表长度分别为n-i +1、n-m。

1、j=m+1;k=i;i=i; 置两个子表的起始下标及辅助数组的起始下标。

2、若i>m 或j>n,转⑷ 其中一个子表已合并完,比较选取结束。

3、选取sourceArr[i]和sourceArr[j]较小的存入辅助数组rf。
如果sourceArr[i]<sourceArr[j],tempArr[k]=sourceArr[i]; i++; k++; 转⑵
否则,tempArr[k]=sourceArr[j]; j++; k++; 转⑵

4、将尚未处理完的子表中元素存入rf。
如果i<=m,将r[i…m]存入tempArr[k…n] //前一子表非空
如果j<=n ,  将r[j…n] 存入tempArr[k…n] //后一子表非空

5、合并结束。

过程演示:

设有数列{35,28,58,10,61,58,97,17}
初始状态:35,28,58,10,61,58,97,17
第一次归并后:{28,35},{10,58},{58,61},{17,97};
第二次归并后:{10,28,35,58},{17,58,61,97};
第三次归并后:{10,17,28,35,58,58,61,97};

时间复杂度为:O(nlogn)。

算法:

#include <stdlib.h>
#include <iostream>

int arr[] = { 35, 28, 58, 10, 61, 58, 97, 17 };
int k = sizeof(arr) / sizeof(arr[0]);

void Merge(int sourceArr[], int tempArr[], int startIndex, int midIndex, int endIndex)
{
	int i = startIndex, j = midIndex + 1, k = startIndex;
	while (i != midIndex + 1 && j != endIndex + 1)
	{
		if (sourceArr[i] > sourceArr[j])
			tempArr[k++] = sourceArr[j++];
		else
			tempArr[k++] = sourceArr[i++];
	}
	while (i != midIndex + 1)
		tempArr[k++] = sourceArr[i++];
	while (j != endIndex + 1)
		tempArr[k++] = sourceArr[j++];
	for (i = startIndex; i <= endIndex; i++)
		sourceArr[i] = tempArr[i];
}

//内部使用递归
void MergeSort(int sourceArr[], int tempArr[], int startIndex, int endIndex)
{
	int midIndex;
	if (startIndex < endIndex)
	{
		midIndex = (startIndex + endIndex) / 2;
		MergeSort(sourceArr, tempArr, startIndex, midIndex);
		MergeSort(sourceArr, tempArr, midIndex + 1, endIndex);
		Merge(sourceArr, tempArr, startIndex, midIndex, endIndex);
	}
}

int main(int argc, char * argv[])
{
	int i, b[8];
	MergeSort(arr, b, 0, k - 1);
	for (int f = 0; f < k; f++)
	{
		std::cout << arr[f] << "  ";
	}
	getchar();
	return 0;
}



http://www.niftyadmin.cn/n/1301499.html

相关文章

枚举工具类,根据code获取枚举对象msg(多态)

1、定义一个CodeEnum接口&#xff0c;供每个枚举实现&#xff0c;以便重写共用方法 public interface CodeEnum {Integer getCode();String getMsg(); }2、枚举类实现CodeEnum接口&#xff0c;并重写方法 import .CodeEnum; import lombok.Getter;Getter public enum Product…

八大排序算法-基数排序

基数排序&#xff08;radix sort&#xff09; 定义&#xff1a; 属于“分配式排序”&#xff08;distribution sort&#xff09;&#xff0c;又称“桶子法”&#xff08;bucket sort&#xff09;或bin sort&#xff0c;顾名思义&#xff0c;它是透过键值的部份资讯&#xff0…

location.href和location.replace的区别

情景 比如支付过程中或者使用商品的优惠券&#xff0c;而使用这张优惠券需要取请求 一个第三方的地址&#xff0c;中间会有一次跳转。 若使用 window.location.href“url” ,按流程操作是没问题的&#xff0c;但是如果用户点击返回&#xff0c;则无法跳回原本的提交订单的页面…

cocos2dx项目在XCode9下ntfw代替system

日前&#xff0c;有网友看了我的博客后&#xff0c;发消息告诉我遇到一个错误&#xff1a;说是找不到system。当前我的项目是没有问题的&#xff0c;没能找出问题所在。 报错如下&#xff1a;Call to unavailable function system: not available on iOS。写这句话是为了写关键…

微信开发 Java SDK微信公众支付(获取openid)

获取openid 1 第一步&#xff1a;用户同意授权&#xff0c;获取code 2 第二步&#xff1a;通过code换取网页授权access_token 3 第三步&#xff1a;刷新access_token&#xff08;如果需要&#xff09; 4 第四步&#xff1a;拉取用户信息(需scope为 snsapi_userinfo) 5 附&#…

javasript性能提升之WebAssembly和asm.js

文章转载自知乎的罗志宇的回答 作者&#xff1a;罗志宇链接&#xff1a;https://www.zhihu.com/question/31415286/answer/58022648来源&#xff1a;知乎著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。下面要讲的&#xff0c;其实是一个悲伤…

asm.js 和 Emscripten 入门教程

文章转载自&#xff1a;http://www.ruanyifeng.com/blog/2017/09/asmjs_emscripten.html Web 技术突飞猛进&#xff0c;但是有一个领域一直无法突破 ---- 游戏。 游戏的性能要求非常高&#xff0c;一些大型游戏连 PC 跑起来都很吃力&#xff0c;更不要提在浏览器的沙盒模型里跑…