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

news/2024/5/17 20:01:36 标签: 归并排序, 非递归, C语言

非递归版的归并排序,省略了中间的栈空间,直接申请一段O(n)的地址空间即可,因此空间复杂度为O(n),时间复杂度为O(nlogn);


实现:

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

void merge1(int a[], int tmp[], int left, int right, int r_end)//实际例程 
	{
		int tmp_pos, l_end;
		int element_num;
		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++];
		}	
	} 
void merge_once(int a[], int tmp[], int n, int step)//当前step下的一趟 
	{
		int i;
		int j; 
		for(i = 0; i <= n-2*step; i += 2*step ){//保证只合并完整的两个子序列 
			merge1(a, tmp, i, i + step, i + 2*step - 1);
		}
		//结束时 i 跳到下一次归并子序列起点(如果还有子序列的话) 
		if(i + step < n+1)// 判断是否超过一个子序列(不会是2个子序列) 
			merge1(a, tmp, i, i+step, n-1);
		else{
			for(j = i; j < n; j++ )
				tmp[j] = a[j]; 
		}	
//*************************************//
//下面这个 保证每次 归并完 都把结果 重新保存到数组 a中	//
//*************************************//	
		for(i = 0; i < n; i++ ){
			a[i] = tmp[i];
		}	
	}

void merge_sort(int a[], int n) //驱动程序 
	{
		int *tmp;
		int step = 1;
		tmp = (int *)malloc(sizeof(int)*n);// 不要忘记 乘 n 
		if(tmp != NULL){
			while(step < n){
				merge_once(a, tmp, n, step);
				step *= 2;
	//下面这个 同样是保证最后的结果都保存在 a 数组中 并且比上面的方法更高效//
//************************************************************//								 	
//				merge_once(tmp, a, n, step);              //
//				step *= 2; 								 //
//******************************************************//
			}
		}
	}	

int main()
	{
		int a[] = {5, 6, 8, 1, 10, 23, 12, 2, 9, 11};
		int n;
		n = sizeof(a)/sizeof(a[0]);
		merge_sort(a, n);
		
		int i;
		for(i = 0; i < n; i++ ){
			printf("%d ",a[i]);
		}
		
		return 0;	
	}		



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

相关文章

如何收集项目日志统一发送到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] > …

Flutter移动应用开发实战——泛型

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

Python错误集锦:pyplot.hist()绘制直方图时提示:ValueError: x must have 2 or fewer dimensions

原文链接&#xff1a;http://www.juzicode.com/archives/3139 错误提示&#xff1a; pyplot.hist()绘制直方图时提示&#xff1a;ValueError: x must have 2 or fewer dimensions #juzicode.com,#VX:桔子code import numpy as np import matplotlib.pyplot as plt plt.rc(fon…

关于SparkStreaming的checkpoint的弊端

框架版本 spark2.1.0 kafka0.9.0.0 当使用sparkstreaming处理流式数据的时候&#xff0c;它的数据源搭档大部分都是Kafka&#xff0c;尤其是在互联网公司颇为常见。 当他们集成的时候我们需要重点考虑就是如果程序发生故障&#xff0c;或者升级重启&#xff0c;或者集群宕机&am…

两个变量实现交换

#include<stdio.h>int main(){int a, b;scanf("%d%d",&a,&b);printf("a %d, b %d",a, b);//核心a a b;b a - b;a a - b; printf("\na %d, b %d",a, b);return 0;}