归并排序(递归版本)C实现~

news/2024/5/17 18:26:26 标签: 归并排序, 递归, c语言
归并原理:
第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置
第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针超出序列尾
将另一序列剩下的所有元素直接复制到合并序列尾
注:此处指针表示能找到该元素地址 并非 一定是c语言中的指针
实现:

#include<stdio.h>
#include<stdlib.h>

void merge(int a[], int tmp[], int left, int right, int r_end)
	{
		int l_end;//左边数组终点 
		int element_num; 
		int tmp_pos; //临时数组初始位置 
		tmp_pos = left;
		l_end = right-1;//默认两段子序列相邻、
		element_num = r_end - left + 1;
		while(left <= l_end && right <= r_end){
			if(a[left] <= a[right]){
				tmp[tmp_pos++] = a[left++];
			}
			else{
				tmp[tmp_pos++] = a[right++];
			}
		} 
		while(left <= l_end){
			tmp[tmp_pos++] = a[left++];
		}
		while(right <= r_end){
			tmp[tmp_pos++] = a[right++];
		}
		int i;
		for(i = 0; i < element_num; i++, r_end-- ){ 
			a[r_end] = tmp[r_end]; 				  
		}
	}
	// a[r_end--] = tmp[r_end--]; 错误  此处 r_end减了两次 
	// a[--tmp_pos] = tmp[r_end--] 此种用法要注意 最后的tmp_pos指向末尾元素下一位置
	 
void m_sort(int a[], int tmp[], int left, int r_end)
	{
		int center;
		if(left < r_end){
			center = (left + r_end)/2;
			m_sort(a, tmp, left, center);
			m_sort(a, tmp, center+1, r_end);
			merge(a, tmp, left, center+1, r_end);
		}	
	}
	
void merge_sort(int a[], int n)
	{
		int *tmp = (int *)malloc(sizeof(int)*n);
		if(tmp == NULL){
			printf("申请内存失败");
			return ;
		}
		m_sort(a, tmp, 0, n-1);
		free(tmp);	
	}	 

int main()
	{
		int a[] = {1,3,5,2,4,6,9};
		int n = sizeof(a)/sizeof(a[0]);
		merge_sort(a, n);
		int i;
		for(i = 0; i < n; i++ ){
			printf("%d\n",a[i]);
		}
		
		return 0;	
	}	


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

相关文章

jquery上传插件uploadify 报错http error 302 解决方法之一

前段时间用到jquery上传插件uploadify时&#xff0c;始终出现系统报出 http error 302 的错误。 网上大量搜集信息&#xff0c;基本上都是说session值丢失的问题&#xff0c;根据网友提供的解决方案进行修改&#xff0c;问题并没有解决。 因此&#xff0c;不排除这是解决302错误…

Flutter移动应用开发实战——异常

QQ 1274510382 Wechat JNZ_aming 商业联盟 QQ群538250800 技术搞事 QQ群599020441 解决方案 QQ群152889761 加入我们 QQ群649347320 共享学习 QQ群674240731 纪年科技aming 网络安全 ,深度学习,嵌入式,机器强化,生物智能,生命科学。

Python错误集锦:在pandas中用to_excel()写文件提示:ModuleNotFoundError: No module named ‘xlwt’

原文链接&#xff1a;http://www.juzicode.com/archives/3127 错误提示&#xff1a; 在pandas中用to_excel()写文件提示&#xff1a;ModuleNotFoundError: No module named ‘xlwt’&#xff1a; import numpy as np import pandas as pd arr np.random.randint(-50,50,size…

归并排序 (非递归版本) C实现~

非递归版的归并排序&#xff0c;省略了中间的栈空间&#xff0c;直接申请一段O(n)的地址空间即可&#xff0c;因此空间复杂度为O(n),时间复杂度为O(nlogn); 实现&#xff1a; #include<stdio.h> #include<stdlib.h>void merge1(int a[], int tmp[], int left, int…

如何收集项目日志统一发送到kafka中?

[img]https://img-blog.csdn.net/20170207190128849[/img] 上一篇&#xff08;[url]http://qindongliang.iteye.com/blog/2354381[/url] &#xff09;写了收集sparkstreaming的日志进入kafka便于后续收集到es中快速统计分析&#xff0c;今天就再写一篇如何在普通应用程序实时收…

Flutter移动应用开发实战——章节介绍进阶-类

QQ 1274510382 Wechat JNZ_aming 商业联盟 QQ群538250800 技术搞事 QQ群599020441 解决方案 QQ群152889761 加入我们 QQ群649347320 共享学习 QQ群674240731 纪年科技aming 网络安全 ,深度学习,嵌入式,机器强化,生物智能,生命科学。

数据可视化~pandas绘图(熊猫会画图?)

原文链接&#xff1a;http://www.juzicode.com/archives/3112 pandas为我们提供了容易上手使用的数据结构和数据分析工具&#xff0c;它的Series和DataFrame数据类型都有一个plot()方法&#xff0c;可以用于绘制常用图形。 1、线型图、基本绘图方法 构造Series时&#xff0c;…

图的割点(简易邻接矩阵)C~

时间戳&#xff1a;记录某个顶点在遍历时候是第几个被访问的。 这里用数组num[]记录时间戳. 用数组low[]记录每个顶点在不经过父顶点时&#xff0c;能够会到的最小时间戳. 割点条件&#xff1a; &#xff08;1&#xff09;当前顶点不是根节点&#xff0c;并且满足low[i] > …