/*arry[100]
mergesort(s,e){
s1=s;
s2=(s+e)/2+1;
e1=s2-1;
e2=e;
if(s<e){
mergesort(s1,e2);
mergesort(s2,e2);
merge(s1,s2,e21,e2);
}
else return ;
递归错误,把函数入口数据输出*/
#include<stdio.h>
int arry[100],n;
int temp[55];
void merge(int s1,int s2,int e1,int e2)
{
int i=s1,j=s2,k=0;
while(i<=e1&&j<=e2){
if(arry[i]<=arry[j]){
temp[k++]=arry[i];
i++;
}
else {
temp[k++]=arry[j];
j++;
}
}
if(i>=e1+1&&j<=e2){
while(j<=e2)
temp[k++]=arry[j++];
}
else if(j>=e2+1&&i<=e1){
while(i<=e2)
temp[k++]=arry[i++];
}
i=0;
j=s1;
while(i<k-1){
arry[j++]=temp[i++];
}
}
void mergesort(int s,int e)
{
int s1,s2,e1,e2;
if(s<e){
s1=s;
e1=(s+e)/2;
s2=e1+1;
e2=e;
mergesort(s1,e1);//putchar('s');
mergesort(s2,e2);
merge(s1,s2,e1,e2);
//putchar('v');
}
//else {putchar('T');return ;}
}
main()
{
int i;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&arry[i]);
mergesort(0,n-1);
for(i=0;i<n;i++)
printf("%d ",arry[i]);
return 0;
}
分享到:
相关推荐
在"简单插入排序 递归法——C语言代码"这个项目中,我们将看到如何使用C语言实现一个递归版本的插入排序。C语言是一种强大的、低级别的编程语言,常用于系统编程、嵌入式开发和高性能计算等领域。它的语法简洁明了,...
【合并排序(分治策略)】是一种高效的排序算法,它采用了经典的分治思想。分治法的基本策略是将一个难以直接解决的大问题分解为若干个规模较小、相互独立、与原问题形式相同的子问题,再将子问题的解组合得到原问题...
根据给定的文件信息,我们可以总结出以下关于“C经典算法之合并排序法”的相关知识点: ### 一、概述 本篇文章将介绍一种经典的排序算法——**合并排序法**(Merge Sort),并通过C语言实现该算法。合并排序是一种...
总结来说,分治法在解决合并排序问题时,通过递归地将大问题分解为小问题,再将小问题的解组合成原问题的解。这一方法既体现了算法设计的优雅,又保证了高效的计算性能。在理解了合并排序的原理和实现后,读者可以将...
在非递归形式的合并排序中,我们不使用递归调用来实现,而是通过循环结构来逐步完成排序。这种实现方式对于内存有限或处理大数据量的情况尤其有用,因为它避免了递归可能导致的栈溢出问题。 下面是一个简化的非递归...
本篇将深入探讨递归函数的概念,递归排序法,以及如何在C语言中实现它们。 首先,我们要理解什么是递归函数。递归函数是指函数在执行过程中调用自身,每次调用都会产生一个新的子问题,直到子问题足够简单,可以...
**合并排序**,又称为归并排序,是利用分治法的一个典型应用。它将待排序的数组分为两个大小相等(或接近)的部分,对这两部分分别进行排序,然后将结果合并起来。这个过程可以递归进行,直到所有子序列都只有一个...
2. **解决子问题**:对每个部分递归地应用合并排序。在`MergeSort`函数内部,首先计算中间索引`mid = (left + right) / 2`,然后分别对左半部分`[left, mid]`和右半部分`[mid+1, right]`调用`MergeSort`函数。 3. *...
以下将详细讲解标题和描述中提到的五种排序算法:选择排序、插入排序、自顶向上合并排序、合并排序以及快速排序。 1. **选择排序(Selection Sort)** 选择排序是一种简单直观的排序算法,它的工作原理是每一次从待...
合并排序是一种高效的、基于分治思想的排序算法。在C++中实现合并排序,我们可以将大问题分解为小问题,然后逐步解决,最终合并结果。这个程序的核心在于理解分治策略,并能熟练运用C++的编程语法。 首先,我们要...
2. **解决**:递归地对每个半序列进行合并排序。 3. **合并**:使用两个指针,依次比较并合并两个已排序的子序列,形成最终的有序序列。 **三、快速排序(Quick Sort)** 快速排序也是一种采用分治策略的排序算法...
- 特点:合并排序是稳定的排序算法,它的时间复杂度为O(n log n),但需要额外的O(n)空间来存储临时数组。 - VB6.0实现:使用递归函数,将序列拆分成较小的子序列,进行排序后再合并,注意在合并过程中要保证稳定性...
合并排序是一种高效的排序算法,基于分治法(Divide and Conquer)的设计理念。在C#中实现合并排序,我们可以遵循以下步骤: 1. **理解合并排序算法**: 合并排序首先将原始数组分为两个子数组,分别对它们进行...
自底向上的合并排序是一种基于分治思想的高效排序算法,它的主要特点是通过逐步合并小规模的有序序列来构建大规模的有序序列。这种算法避免了传统合并排序在处理大规模数据时需要额外空间的问题,因为它是从最小的...
这个过程通过递归地对这两部分进行快速排序来完成,直到子数组的大小只有一项,排序结束。 快速排序的基本步骤如下: 1. 选取数组中的一个元素作为基准。 2. 将数组元素与基准比较,小于基准的放在基准前面,大于...
2. **排序**:对每个子数组分别进行合并排序,这会递归地调用`merge_func`自身。 3. **合并**:这是合并排序算法的核心,将两个已排序的子数组合并成一个大的有序数组。这个过程涉及比较两个子数组的元素,将较小的...
1. **分治法**:合并排序的核心在于“分而治之”。首先,将待排序的序列拆分成两个或更多的子序列,每个子序列只包含一个元素,然后不断地将相邻的子序列两两合并,直到只剩下一个有序序列为止。 2. **合并过程**:...
1. **分治思想**:合并排序的核心是分治法,即将一个大问题分解为若干个规模较小的相同问题,然后分别解决这些小问题,最后再将这些小问题的解组合起来,得到原问题的解。 2. **基本步骤**: - **划分**:将原始数...
快速排序是一种非常高效的排序算法,采用分治法策略来把一个序列分为较小和较大的两个子序列,然后递归地排序两个子序列。 1. **选取基准**:从数组中挑选一个元素作为基准。 2. **分区**:重新排列数组,所有元素...