合并排序(C语言实现)

2016-02-19 11:03 3 1 收藏

每个人都希望每天都是开心的,不要因为一些琐事扰乱了心情还,闲暇的时间怎么打发,关注图老师可以让你学习更多的好东西,下面为大家推荐合并排序(C语言实现),赶紧看过来吧!

【 tulaoshi.com - 编程语言 】

其基本模式如下:

分解:把一个问题分解成与原问题相似的子问题

解决:递归的解各个子问题

合并:合并子问题的结果得到了原问题的解。

现在就用递归算法,采用上面的分治思想来解合并排序。

                      合并排序(非降序)

分解:把合并排序分解成与两个子问题

伪代码:

代码如下:

MERGE_SORT(A, begin, end)

if begin end

   then mid- int((begin + end)/2)

           MERGE_SORT(A, begin, mid)

           MERGE_SORT(A, mid+1, end)

           MERGE(A, begin, mid, end)

解决:递归的解各个子问题,每个子问题又继续递归调用自己,直到"beginend"这一条件不满足时,即"begin==end"时,此时只有一个元素,显然是有序的,这样再进行下一步合并。

合并:合并的子问题的结果有个隐含问题,即各个子问题已经是排好序的了(从两个氮元素序列开始合并)。做法是比较两个子序列的第一个元素小的写入最终结果,再往下比较,如下图所示:

        图中:待排序数组为2 4 6  1 3 5

        把2 4 6和 1 3 5 分别存到一个数组中,比较两个数组的第一个元素大小小者存于大数组中,直到两小数组中元素都为32767.

        这里32767 味无穷大,因为 c语言中  int类型是32位,表示范围是-32768-----32768。用无穷大作为靶子可以减少对两个小数组是否为空的判断,有了靶子,直接判断大数组元素个数次就排完了。 

     在整个过程中执行过程示如下图:

分解+执行时自上向下,合并时自下向上。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

 代码奉上:

代码如下:

#include stdio.h

void MERGE(int *A, int b, int m, int e)

{      

        int l = m-b+1, r = e-m, i;

        int L[l+1], R[r+1];

        for(i=0; i l; i++)

        {

            L[i] = A[b+i];

        }

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

        for (i=0; i r; i++)

        {

            R[i] = A[m+i+1];

        }

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

        L[l] = 32767;

        R[r] = 32767;

        l = 0;

        r = 0;

        for(i=0; i e-b+1; i++)

        {

            if(L[l] R[r])

            {

                A[b+i] = L[l];

                l ++;

            }

            else            {

                A[b+i] = R[r];

                r ++;

            }

        }

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

}

void MERGE_SORT(int *A, int b, int e)

{

        if(b e)

        {

            int m = (b + e) / 2;

            MERGE_SORT(A, b, m);

            MERGE_SORT(A, m+1, e);

            MERGE(A, b, m, e);

        }

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

}

int main()

{

        int A[500];

        int lens, i;

        printf("Please Enter the lenghth of array:");

        scanf("%d", &lens);

        printf("Please Enter the elements of the array:");

        for(i=0; i lens; i++)

            scanf("%d", &A[i]);

        MERGE_SORT(A, 0, lens-1);

        printf("the result of the sort is:n");

        for(i=0; i lens; i++)

        {

            printf("%d ", A[i]);

        }

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

        return 0;

}

来源:http://www.tulaoshi.com/n/20160219/1596428.html

延伸阅读
建立了一个单链表之后,假如要进行一些如插入、删除等操作该怎么办?所以还须把握一些单链表的基本算法,来实现这些操作。单链表的基本运算包括:查找、插入和删除。下面我们就一一介绍这三种基本运算的算法,并结合我们建立单链表的例子写出相应的程序。 1、查找 对单链表进行查找的思路为:对单链表的结点依次扫描,检...
总在写 总在错, 面试也还忘记 学习就是这么个过程, 温故才知新, 望自己谨记 忘记不要紧 复习就好 //排序是有很多种方法的 ,完成从小到大的排列 代码如下: #include stdio.h void sort(int *a,int len) {int i=0;  int j;  int t;     for(i=0;ilen;i++)     {     &n...
首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。 代码如下: View Code  //将有序数组a[]和b[]合并到c[]中  void MemeryArray(int a[], int n, int b[], int m, int c...
  用c实现的插入排序法,先输入10个数,然后利用插入排序法进行排序,将结果输出。算法简单,可供初学者学习。 !-- frame contents -- !-- /frame contents --   #include "stdio.h"   #include "conio.h"   main()   {     int a[10],r[11];    &nbs...
import Java.io.*; public class MIMEBase64 { /* 这是个简单的Base64编码程序 作者:Roc Chen rocanny@163.com Base64 使用US-ASCII子集的65个字符, 每个字符用6位表示 因此"m"的Base64值为38, 二进制形式是 100110. 对于文本串,编码过程如下。例如"men": 先转成US-ASCII值. ...

经验教程

401

收藏

94
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部