`
junfeng_feng
  • 浏览: 19927 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mergesort unrecursive 归并排序的非递归实现

 
阅读更多
/*
 * mergesort_unrecursive.cpp
 *
 *  Created on: Dec 14, 2011
 *      Author: junfeng
 *
 //从分治策略的机制入手,容易消除归并排序算法中的递归,事实上,

 //算法Mergesort的递归过程只是将待排序列 集合一分为二,直到待排序列集合

 //只剩下一个元素为止,然后不断合并两个排好序的数组段。按此机制,可以首先

 //将数组a中相邻元素两两配对。用合并算法将它们排序,构成n/2组长度为2的排好

 //序的子数组段,然后再将它们 排序成长度为4的排好序的子数组段,如此继续下去,

 //直至整个数组排好序。这就是自然合并排序的思想。对于n元数组已排好序情况

 //自然排序算法不执行合并,而算法mergesort需执行[logn]次合并。
 *
 *
 */

#ifndef MERGESORT_UNRECURSIVE_
#define MERGESORT_UNRECURSIVE_

#include<stdio.h>

void mergesort_unrecursive(int* a, const int n);
void print(int const * a, const int n);

int main()
{
	int a[] = { 1, 3, 2, 4, 5, -1, 0, -2, -3, -4, -5 };
	int len = sizeof(a) / sizeof(*a);

	print(a, len);
	mergesort_unrecursive(a, len);
	print(a, len);

	return 0;
}
void mergesort_unrecursive(int* a, const int n)
{
	int* b = new int[n];

	int len = 1;
	while (len < n)
	{
		/*
		 * 初始len==1
		 */
		int start = 0;
		int end = start + len;

		int k, start_max, end_max;
		while (start < n)
		{
			start_max = start + len;
			end_max = end + len;

			/*
			 * 处理一个小于len片断的情况
			 */
			if (start_max > n)
				break;//结束当前len的一次merge
			/*
			 * 处理最后一个长度len和小于len的两个片断
			 */
			if (end_max > n)
				end_max = n;//

			//			printf("start=%d\n", start);
			//			printf("start_max=%d\n", start_max);
			//			printf("end=%d\n", end);
			//			printf("end_max=%d\n", end_max);

			//复制merge的部分
			for (int i = start; i < end_max; i++)
				b[i] = a[i];

			/*
			 * end==start+len;
			 * merge [start,end]
			 * 		 [end,end+len]
			 */
			k = start;
			while (start < start_max && end < end_max)
			{
				if (b[start] < b[end])
					a[k++] = b[start++];
				else
					a[k++] = b[end++];
			}
			while (start < start_max)
				a[k++] = b[start++];
			while (end < end_max)
				a[k++] = b[end++];

			/*
			 * 下2个len的片断
			 */
			start = end_max;//这个开始错写尾s=end+len;
			end = start + len;

			//			printf("len=%d\n", len);
			//			printf("a=");
			//			print(a, n + 1);
		}
		len = len * 2;//开始错误:没有这句
	}

	delete[] b;
}
void print(int const * a, int const n)
{
	for (int i = 0; i < n; i++)
		printf("%d ", a[i]);
	printf("\n");
}
#endif //MERGESORT_UNRECURSIVE_

分享到:
评论

相关推荐

    归并排序的非递归实现

    归并排序的非递归实现是指使用迭代的方式实现归并排序算法,而不是使用递归的方式。下面是对归并排序的非递归实现的知识点总结: 一、归并排序的基本概念 归并排序是一种常用的排序算法,它的基本思想是将需要排序...

    8645 归并排序 (非递归算法).txt

    标题与描述均提到了“8645 归并排序(非递归算法)”,这表明文件内容将围绕归并排序这一数据结构与算法领域的核心主题展开,且特别强调了非递归实现方式。归并排序是一种高效、稳定的排序算法,基于分治策略,其...

    非递归的归并排序(一种优排序)

    以上代码展示了如何在非递归情况下实现归并排序。虽然这是一个递归版本的示例,但非递归版本只需将分割和合并步骤放入循环中,去除递归调用即可。通过理解这个过程,你可以自己编写一个非递归的C++归并排序实现。

    三路归并_C语言_三路归并排序_三路归并_

    **三路归并排序**是一种高效的排序算法,尤其在处理含有大量重复元素的序列时表现优秀。该算法基于归并排序的思想,但将其分为三...在C语言中,通过合理的指针管理和递归结构,可以实现清晰且高效的三路归并排序算法。

    数据结构 排序算法之归并排序

    2. **非递归实现**:非递归归并排序使用循环和栈来模拟递归的过程。它通过维护一个栈来保存待合并的子序列,每次从栈中取出两个子序列进行合并,然后将新产生的子序列压入栈中,直至栈为空,整个序列排序完成。这种...

    java实现归并排序

    Java实现归并排序 Java 实现归并排序是一种常用的排序算法,通过分治策略将原始数组分成小组,然后对每个小组进行排序,最后将排序好的小组合并成一个有序数组。下面是 Java 实现归并排序的知识点总结: 基本思想 ...

    归并排序算法实现

    ### 归并排序算法实现详解 #### 一、引言 归并排序是一种经典的排序算法,采用分治法的思想,将待排序数组分为若干个子序列,这些子序列是已排序的,然后再按照一定的方式合并这些子序列得到最终排序后的数组。...

    MergeSort:归并排序算法的实现

    在Java中实现归并排序,主要涉及以下几个步骤: 1. **分割**:将原始数组或列表分为两个相等(或接近相等)的部分。这通常通过取数组中间索引来完成,例如`mid = (left + right) / 2`。 2. **递归排序**:对左半...

    归并排序的递归实现与非递归实现代码

    非递归实现归并排序,也称为自底向上的归并排序,不使用递归来划分数组,而是通过一系列的合并操作逐步从小规模的排序到大规模的排序。这种方法从最小子数组(长度为1)开始,逐渐合并相邻的子数组,直到整个数组...

    归并排序c语言实现

    在C语言中实现归并排序,我们需要理解算法的基本原理、步骤,并能用C语言有效地编写代码。下面将详细介绍归并排序的原理、C语言实现的关键点以及如何优化算法性能。 **归并排序原理** 归并排序的核心思想是将大...

    mergesort非递归算法C++实现

    用非递归算法实现合并排序,具有高效的特征,从底向上

    Java排序算法三之归并排序的递归与非递归的实现示例解析

    非递归的实现方式通过使用while循环来实现归并排序。首先,声明一个临时数组用来存放当前的归并后的两个数组;然后,将临时数组复制回原数组对应的位置。下面是非递归的实现代码: ```java public void mergeSort...

    8645 归并排序(非递归算法) (SCAU习题).pdf

    在非递归版本的归并排序中,我们不使用递归调用来实现,而是采用循环结构来完成同样的任务。本题要求用C++编写一个非递归的归并排序算法,同时在每趟排序结束后输出排序结果。 首先,我们要理解归并排序的基本步骤...

    用单链表和队列实现归并排序

    在标题“用单链表和队列实现归并排序”中,我们可以理解到这个实现是利用了链表和队列的数据结构。链表是一种线性数据结构,其中的元素在内存中不是顺序存储的,而是通过指针链接。队列则是一种先进先出(FIFO)的...

    mergesort:归并排序算法并行顺序实现

    在Java中,实现归并排序可以使用内置的`java.util.Arrays.sort()`方法,该方法内部使用了Timsort,一种混合排序算法,其中包含了归并排序的思想。但如果我们需要自定义并行归并排序,我们可以利用Java的并发库,如`...

    二路归并排序

    MergeSort 函数是二路归并排序的主函数,它将待排序的记录分成多个部分,然后对每个部分进行排序,最后将已排序的部分合并成一个有序的序列。 实验结果 实验结果显示了二路归并排序的过程,每一趟的排序结果都会被...

    归并排序C++实现的例子

    5. **C++编程基础**:实现归并排序需要掌握C++的基本语法,如函数定义、数组操作、指针和引用的使用、递归函数的编写等。在Visual Studio 2010环境下,我们需要确保代码符合C++03或C++11标准。 6. **效率分析**:...

    归并排序Java_归并排序_

    在Java中实现归并排序,我们可以创建一个名为`MergeSort`的类来封装整个过程。归并排序的基本思想是将待排序的序列分成两个或更多的子序列,对每个子序列分别进行排序,然后将排序后的子序列合并成一个有序序列。这...

    归并排序 C语言实现

    在C语言中实现归并排序,我们需要理解其核心步骤并用适当的编程语法来表达。 首先,归并排序分为两个主要阶段:分割(Divide)和合并(Merge)。在分割阶段,我们将原始数组分成两个或更多的子数组,直到每个子数组...

    基于vc++6.0用链表实现归并排序

    其中,实现归并排序的核心函数可能是`mergeSort`,它接受一个链表头指针,并返回新的已排序的链表头指针。`merge`函数用于合并两个已排序的链表。 `main.cpp`文件是程序的入口,它包含必要的头文件,创建链表,调用...

Global site tag (gtag.js) - Google Analytics