`
beefcow
  • 浏览: 44515 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
最近访客 更多访客>>
社区版块
存档分类
最新评论

归并排序的实现 C语言版

阅读更多

 

 

   代码如下(我的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),相当理想了。

   

   再另外,传说单链表的排序可以用归并?不解,待解(已解,参看这里)

 

 

 

2
3
分享到:
评论

相关推荐

    归并排序C语言实现

    在C语言中实现归并排序,我们需要理解以下几个关键知识点: 1. **分治法**:归并排序的核心思想是将大问题分解为小问题来解决。首先将数组分为两半,分别对两半进行排序,然后合并两个已排序的半部分,得到完整的...

    选择排序、插入排序、冒泡排序以及快速排序和归并排序的C语言实现,绝对可用

    选择排序、插入排序、冒泡排序以及快速排序和归并排序的C语言实现,绝对可用

    归并排序c语言实现

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

    归并排序算法C语言实现

    完整的实现了归并排序的算法,使用C语言实现,相信看过本程序之后,会对归并排序了如指掌

    c语言实现归并排序

    c语言实现归并排序,递归方式实现,含详细注释

    C语言算法之归并排序C语言算法之归并排序

    ### C语言中的归并排序详解 #### 一、归并排序的基本概念与原理 归并排序是一种基于**分而治之**策略的经典排序算法。它将一个数组分成两半,递归地对每一半进行排序,然后将排序后的两部分合并成一个有序数组。 ...

    C语言二路归并排序算法

    本篇介绍一种具体的实现方法——二路归并排序,并通过C语言来实现。 #### 关键概念 在了解二路归并排序之前,我们需要先明确几个关键的概念: 1. **分治法**:这是一种解决问题的方法论,即将问题分解为两个或更...

    C语言实现的归并排序

    以前喜欢在网上找,现在自己写一些简单的小程序,希望对大家有用,用语言简单的实现归并排序!

    归并排序 C语言实现

    好用的归并排序算法用C语言实现,欢迎下载

    分治法归并排序的C语言实现, 复杂度O(nlogn)

    在这个案例中,我们关注的是如何使用C语言来实现归并排序。 在C语言中,归并排序通常包括以下几个关键步骤: 1. **分割**:将原始数组分成两个或更多的子数组,每个子数组的元素数量尽可能接近。这可以通过递归地...

    048 归并排序 C语言 归并排序 C语言

    在C语言中实现归并排序,我们需要理解其基本原理和步骤,然后编写相应的代码。下面将详细解释归并排序的原理、步骤以及C语言实现的关键点。 **归并排序原理:** 归并排序利用了分而治之的思想,将大问题分解为小...

    归并排序c语言

    归并排序C语言实现,这里提供给大家分享,很好用!

    归并排序算法(C语言)

    总之,归并排序作为计算机科学中的经典排序算法之一,其在C语言中的实现不仅体现了算法设计的精妙之处,也展示了C语言作为系统级编程语言的强大功能。对于学习数据结构和算法的学生来说,掌握归并排序的原理及其...

    插入排序和归并排序的c语言算法实现

    随机产生10000以上的数据,放入输入文件input.txt,对其进行插入排序和合并排序,排序后的结果和两种排序算法的运行时间输出到文件output.txt

    归并排序c语言实现.md

    归并排序c语言

    排序代码(C语言),快速排序,冒泡排序,归并排序等等

    今天,我们将讨论几种常见的排序算法的实现,包括快速排序、冒泡排序、归并排序等。 快速排序 快速排序是一种高效的排序算法,它的时间复杂度为O(n log n)。快速排序的基本思想是选择一个轴元素,将数组分为两部分...

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

    在本文中,我们将深入探讨三路归并排序的原理、实现细节以及其在C语言中的应用。 ### 1. 算法概述 三路归并排序的核心是将一个大数组分为三个较小的子数组,分别对这三个子数组进行排序,然后将排序后的子数组合并...

    归并排序算法代码实现

    这是关于归并排序算法用C语言实现的代码,是经过测试正确的,希望能对大家的学习有所帮助。

    VC++多线程实现三种排序算法比较----冒泡排序、快速排序、归并排序

    本篇文章主要探讨了如何在VC++环境中利用多线程技术来实现三种经典的排序算法:冒泡排序、快速排序和归并排序,并对它们的性能进行了比较。 首先,冒泡排序是一种简单的排序算法,它重复地遍历待排序的数列,一次...

Global site tag (gtag.js) - Google Analytics