非递归实现归并排序是一种迭代式的排序算法,它避免了递归调用带来的额外开销,通常使用循环和迭代来实现归并排序的过程: 确定归并区间的思路:对于给定的数组,首先将相邻的元素两两归并(gap=1),然后将归并的区间长度不断扩大,依次归并相邻的区间、长度为 2 的区间、长度为 4 的区间,直到整个数组都归并完成(gap=2)。
非递归法与递归法的思路是一模一样的,只不过呈现的形式有所不同, 首先我们来回忆一下递归法的过程, 就是先递归让数组的区间元素个数为1, 认为为有序数组, 然后依次回退进行归并, 我们这里也可以这样, 首先模拟一个元素为一个区间, 进行归并, 然后两个有序元素进行归并, 然后变成四个, 八个, 直到归并区间个...
(int)); int k=1; /* * 循环k为序列长度,与递归的方式相比,正好反过来,非递归方式直接从序列为1开始合并,直到序列不小于待排序的数组长度为止 * 每次循环都是子序列*4变长的过程 */ while (k<L->len) { merge_pass(L->r, tr, k, L->len); // 序列1变2 k++; merge_pass(tr, L->r, k...
//归并排序的非递归void MergeSortNonR(int* a, int sz){int* tmp = (int*)malloc(sizeof(int) *sz);int gap = 1; // 每组数据个数while (gap < sz){for (int i = 0; i < sz; i += 2 * gap){// [i, i+gap-1] [i+gap,i+2*gap-1]int begin1 = i, end1 = i + gap -...
1/**2* merge_sort: 非递归实现 --迭代3* 非递归思想: 将数组中的相邻元素两两配对。用merge函数将他们排序,4* 构成n/2组长度为2的排序好的子数组段,然后再将他们排序成长度为4的子数组段,5* 如此继续下去,直至整个数组排好序。6**/78#include <stdio.h>9#include <stdlib.h>10#defineLEN 81112/...
2. 非递归 #include <stdio.h> #include <stdlib.h> #include <string.h> /* 函数功能:归并排序函数参数: arr: 待排序的数组 length: 该数组的长度 */ void merge_sort(int* arr, int length) { int step = 1; //归并区间步长 int l[length], r[length]; //gcc, 两个临时数组,分别保存待归并...
3.1快排的非递归实现 快排的非递归应用场景是比较少的,因为快排也不是那么容易就爆栈,但是学习快排的非递归也能帮助我们更好地理解快排。 快排的非递归写法用C语言实现会相对复杂,因为快排的非递归需要利用栈来实现,但是C语言没有自己的STL库,所以要自己手写一个栈,相对比较麻烦些。
非递归算法 图示 代码(C语言) /* 这里Merge函数在递归版本中给出 *//* length = 当前有序子列的长度*/void Merge_pass( ElementType A[], ElementType TmpA[], int N, int length ){ /* 两两归并相邻有序子列 */int i, j;for ( i=0; i <= N-2*length; i += 2*length )Merge( A, TmpA...
1、栈溢出原因和递归的基本认识 我们先简单来了解下内存分布结构:栈区:⽤于存放地址、临时变量等;堆区:程序运⾏期间动态分配所使⽤的场景;静态区:存放全局变量和静态变量,具体还分为 .bss段和.data段;.bss段:存放未初始化的和初始化为0的全局变量或者静态变量;.data段:初始化不为0的全局变量或者...
void MergeSort(int x[],int n) { //非递归归并排序 //元素数组为x,其长度为n int i,j,k1,k2,l;int *a;for(i=1;i<=n-1;i=i*2)//i为插入排序的子段长度 { for(j=1;j<=n-1;j=j+2*i)//j为进行插入排序的子段起始位置 { a=(int *)malloc(2*i*sizeof(int));l=...