归并排序,递归数组下面变化

问题描述

归并排序,递归数组下面变化

请问大家在//递归调用这部
Merge(sourceArr,tempArr,startIndex,midIndex,endIndex);// 为什么第一次执行完这部后,endIndex从1变为了2,哪里给他加1了?

// 2路归并排序
namespace ConsoleApplication1
{
class CMergeSort
{
static void Main(string[] args)
{
int[] a = new int[5] { 50, 32, 20, 30, 70 };
int[] b = new int[5];
int i;
MergeSort(a, b, 0, 4);
}

//递归调用!!!
static void MergeSort(int[] sourceArr, int[] tempArr,int startIndex, int endIndex)
{
int midIndex;

if (startIndex == endIndex)
    {
    tempArr[startIndex] = sourceArr[startIndex];
    }
    else
{
    midIndex=(startIndex+endIndex)/2;
    MergeSort(sourceArr,tempArr,startIndex,midIndex);
    MergeSort(sourceArr,tempArr,midIndex+1,endIndex);
    Merge(sourceArr,tempArr,startIndex,midIndex,endIndex);// 为什么第一次执行完这部后,endIndex从1变为了2,哪里给他加1了?
}

}

static 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)
while(i<=midIndex&& j<=endIndex)
{
if(sourceArr[i]<sourceArr[j])
tempArr[k++] = sourceArr[i++];
else
tempArr[k++] = sourceArr[j++];
}
while (i<=midIndex)
tempArr[k++] = sourceArr[i++];
while (j<=endIndex)
tempArr[k++] = sourceArr[j++];
for (i = startIndex; i <= endIndex; i++)
sourceArr[i] = tempArr[i];
}

//int main(int argc,char * argv[])
//{
// int a[8]={50,10,20,30,70,40,80,60};
// int i,b[8];
// MergeSort(a,b,0,7);
// for(i=0;i<8;i++)
// printf("%d ",a[i]);
// printf("n");
// return 0;
//}
}
}


时间: 2024-10-10 14:28:26

归并排序,递归数组下面变化的相关文章

MIT6.006Lec03:插入排序,归并排序,递归树

MIT6.006是算法导论课,Lec03主要讲插入排序,归并排序,以及分析方法(递归树)等. 插入排序,可以分为线性插入排序.二分插入排序,区别在于当把数组中某元素插入到前面的有序列表中时,前者遍历,后者二分,后者更加稳定. 归并排序,是用分治思想处理,先分别排序,再合并. 递归树,我的理解是算法消耗时间T(n)用树状的结构,表示每次递归消耗的时间,这些时间累加就是T(n),而递归树的每一行和相邻行之间的关系也是比较容易观察的,这就容易写出时间复杂度的表达式了.另外有主定理可以使用. 参考了<算

递归遍历二叉树,怎样保存结点数值到数组里

问题描述 递归遍历二叉树,怎样保存结点数值到数组里 求讲解 递归遍历二叉树的时候,怎样能 在访问每个结点时,将结点的数值存到数组里.最后得到一个结点数值的数组.教材上遍历的时候都是直接输出,没有存到数组里,但是我在编程时遇到了要存到数组里的问题.求大神~~~ 追问: 追问一下,我晚上试了一下,感觉使用数组作为参数看起来可以,但是在递归的时候每次递归数组的角标i都会被重新定义.貌似全局变量或者静态局部变量在递归时都会被重新定义.这怎么处理啊 好心塞 解决方案 将数组作为一个遍历函数的一个参数,遍历

数据结构之归并排序(merging sort) 详解

归并排序(merging sort): 包含2-路归并排序, 把数组拆分成两段, 使用递归, 将两个有序表合成一个新的有序表. 归并排序(merge sort)的时间复杂度是O(nlogn), 实际效果不如快速排序(quick sort)和堆排序(heap sort), 但是归并排序是稳定排序, 而快速排序和堆排序则不是. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1

常见的五类排序算法图解和实现(归并类:二路归并排序)

归并类的排序算法 归并:将两个或两个以上的有序表组合成一个新的有序表. 内部排序中,通常采用的是 2-路归并排序.即:将两个位置相邻的记录有序子序列归并为一个记录有序的序列.归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 图解如下 看成是 n 个有序的子序列(长度为 1),然后两两归并. 得到 n/2 个长度为2 或 1 的有序子序列.继续亮亮归并 最后一趟 代码如下: 1 //二路一次归并过程的算法 2 //lo

《算法基础:打开算法之门》一3.4 归并排序

3.4 归并排序 我们的下一个排序算法是归并排序,对于所有情况,它有一个仅仅Θ(nlgn)的运行时间.当将它的运行时间和选择排序与插入排序的最坏运行时间Θ(n2)进行比较时,我们仅仅是将n这个因子替换成了lgn这个因子.正如我们在第1章中所指出的那样,这是一个非常划算的交易. 归并排序与我们已经看到的两种排序算法相比有一些不足.首先,隐含在渐近符号前面的常量因子比另外两个算法的渐近符号前面的常量因子的值大.当然,一旦数组规模n变得非常大,那个常量因子也变得没有那么重要了.第二,归并排序不是原址的

如何利用SQL Server With As递归获取层级关系数据

WITH AS的含义 WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会 被整个SQL语句所用到.有的时候,是为了让SQL语句的可读性更高些,也有可能是在UNION ALL的不同部分,作为提供数 据的部分. 特别对于UNION ALL比较有用.因为UNION ALL的每个部分可能相同,但是如果每个部分都去执行一遍的话,则成本太高, 所以可以使用WITH AS短语,则只要执行一遍即可.如果WITH AS短语所定义的表

实现真正意义上的二维动态数组模板

我们可以通过动态数组的反例来确定动态数组应该具有哪些特性.大家都知道以下的方式是定义一个静态数组. int iCount[10]; int iCount[10][10]; 从上面可以看出,定义了静态数组之后,无论程序如果使这个数组,该数组在内存中所占空间的大小,位置是确定不变的. 我们可以得出结论,对于编译器,静态数组的大小和空间是已知的,因此编译器可以自动为该数组分配空间.具体情况是:如果你定义了一个全局数组,编译器将在数据区为你的数组分配一个空间:如果是个局部数组(比如定义在某一个局数中),

c语言-C语言用递归求圆周率的值,怎么实现

问题描述 C语言用递归求圆周率的值,怎么实现 C语言用递归求圆周率的值,要求精确到小数点后3位,不得使用循环 解决方案 C语言实现求圆周率归并排序递归实现C语言

c语言中小递归,大神看看哪里出了问题

问题描述 c语言中小递归,大神看看哪里出了问题 include int main (){ int func (int i); int a[5]i; printf (""%d ""func(5)); return 0;} int func (int i){ int a[5]; if (i == 1) a[i] = 10; if (i > 1) a[i] = func[i-1]+2;} 解决方案 #include <stdio.h>int func (