代码如下(我的C语言比较丑陋,将就着看吧)。
其实感觉挺惊讶的是,递归能让算法如此简洁。
归并的思路也比较简单,就是不断merge有序的数组。当然了,数据的有序可不是天生就有的,这儿找到有序数组的法子就是不断地二分数组,直至有序,何时会达到这个状态呢?比较傻的一个答案:等分到数组只一个元素时,就OK了(汗...),不过这只是初始阶段,之后的各个分支汇合时,有序的可就是一条条的数组了。
#include <stdio.h>
#include "tool.c"
int main(){
void mergeSort(int array[],int left,int right);
int array[11]={1,2,3,6,8,9,5,4,3,2,54};
printf("Befor mergeSort:\n");
printArray(array,11);
mergeSort(array,0,10);
printf("After mergeSort:\n");
printArray(array,11);
getchar();
return 0;
/*Result:
Befor mergeSort:
1 2 3 6 8 9 5 4 3 2 54
After mergeSort:
1 2 2 3 3 4 5 6 8 9 54
*/
}
/*
Recursively call the mergeSort method,and merge the sorted array.
*/
void mergeSort(int array[],int left,int right){
void merge(int array[],int left,int right);
if(right>left){
mergeSort(array,left,(left+right)/2);
mergeSort(array,(left+right)/2+1,right);
merge(array,left,right);
}
}
/*
here,is the key point.
merge the sorted array.
*/
void merge(int array[],int left,int right){
int rStartPoint=(right+left)/2+1;
//Length of the left and right arrays.
int leftLen=rStartPoint-left;
int rightLen=right-rStartPoint+1;
//copy the data into leftArray and rightArray,quite stupid here.
//and here is the shortage of mergeSort,it needs additional memory space.
int leftArr[leftLen],rightArr[rightLen];
int i,j;
for(i=0;i<=leftLen-1;i++){
leftArr[i]=array[left+i];
}
for(j=0;j<=rightLen-1;j++){
rightArr[j]=array[rStartPoint+j];
}
//insert data into array from two arranged ones.
i=0,j=0;
int k=left;
while(i<=leftLen-1&&j<=rightLen-1){
if(leftArr[i]<rightArr[j]){
array[k++]=leftArr[i++];
}else{
array[k++]=rightArr[j++];
}
}
while(i<=leftLen-1){
array[k++]=leftArr[i++];
}
while(j<=rightLen-1)
array[k++]=rightArr[j++];
}
另外,我之前一直觉得不断地Merge两个数组,是属于效率比较低的做法,不明白怎么这样了居然归并还能是高效排序,后来才注意到一点,这儿不断的连接的数组可都是有序的,有序数组的合并复杂度可以达到O(N),相当理想了。
再另外,传说单链表的排序可以用归并?不解,待解(已解,参看这里)。
分享到:
相关推荐
在C语言中实现归并排序,我们需要理解以下几个关键知识点: 1. **分治法**:归并排序的核心思想是将大问题分解为小问题来解决。首先将数组分为两半,分别对两半进行排序,然后合并两个已排序的半部分,得到完整的...
选择排序、插入排序、冒泡排序以及快速排序和归并排序的C语言实现,绝对可用
在C语言中实现归并排序,我们需要理解算法的基本原理、步骤,并能用C语言有效地编写代码。下面将详细介绍归并排序的原理、C语言实现的关键点以及如何优化算法性能。 **归并排序原理** 归并排序的核心思想是将大...
完整的实现了归并排序的算法,使用C语言实现,相信看过本程序之后,会对归并排序了如指掌
c语言实现归并排序,递归方式实现,含详细注释
本篇介绍一种具体的实现方法——二路归并排序,并通过C语言来实现。 #### 关键概念 在了解二路归并排序之前,我们需要先明确几个关键的概念: 1. **分治法**:这是一种解决问题的方法论,即将问题分解为两个或更...
以前喜欢在网上找,现在自己写一些简单的小程序,希望对大家有用,用语言简单的实现归并排序!
好用的归并排序算法用C语言实现,欢迎下载
### C语言中的归并排序详解 #### 一、归并排序的基本概念与原理 归并排序是一种基于**分而治之**策略的经典排序算法。它将一个数组分成两半,递归地对每一半进行排序,然后将排序后的两部分合并成一个有序数组。 ...
在这个案例中,我们关注的是如何使用C语言来实现归并排序。 在C语言中,归并排序通常包括以下几个关键步骤: 1. **分割**:将原始数组分成两个或更多的子数组,每个子数组的元素数量尽可能接近。这可以通过递归地...
在C语言中实现归并排序,我们需要理解其基本原理和步骤,然后编写相应的代码。下面将详细解释归并排序的原理、步骤以及C语言实现的关键点。 **归并排序原理:** 归并排序利用了分而治之的思想,将大问题分解为小...
在本文中,我们将深入探讨三路归并排序的原理、实现细节以及其在C语言中的应用。 ### 1. 算法概述 三路归并排序的核心是将一个大数组分为三个较小的子数组,分别对这三个子数组进行排序,然后将排序后的子数组合并...
归并排序C语言实现,这里提供给大家分享,很好用!
总之,归并排序作为计算机科学中的经典排序算法之一,其在C语言中的实现不仅体现了算法设计的精妙之处,也展示了C语言作为系统级编程语言的强大功能。对于学习数据结构和算法的学生来说,掌握归并排序的原理及其...
随机产生10000以上的数据,放入输入文件input.txt,对其进行插入排序和合并排序,排序后的结果和两种排序算法的运行时间输出到文件output.txt
归并排序c语言
今天,我们将讨论几种常见的排序算法的实现,包括快速排序、冒泡排序、归并排序等。 快速排序 快速排序是一种高效的排序算法,它的时间复杂度为O(n log n)。快速排序的基本思想是选择一个轴元素,将数组分为两部分...
这是关于归并排序算法用C语言实现的代码,是经过测试正确的,希望能对大家的学习有所帮助。
【基础算法】-C语言实现归并排序归并排序算法思路先将待排序的序列拆分成若干小规模子序列,直到每个子序列可以直接排序为止。然后对每个子序列进行排序,合并成新的有序序列。重复第二步,直到只剩下一个排序完毕的...