C语言实现合并排序

其基本模式如下:

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

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

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

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

合并排序(非降序)

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

伪代码:


  1. MERGE_SORT(A, begin, end) 
  2. if begin < end 
  3.    then mid<- int((begin + end)/2) 
  4.            MERGE_SORT(A, begin, mid) 
  5.            MERGE_SORT(A, mid+1, end) 
  6.            MERGE(A, begin, mid, end) 

 

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

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

 

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

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

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

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

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

代码奉上:


  1. #include <stdio.h> 
  2. void MERGE(int *A, int b, int m, int e) 
  3. {        
  4.         int l = m-b+1, r = e-m, i; 
  5.         int L[l+1], R[r+1]; 
  6.         for(i=0; i< l; i++) 
  7.         { 
  8.             L[i] = A[b+i]; 
  9.         } 
  10.         for (i=0; i< r; i++) 
  11.         { 
  12.             R[i] = A[m+i+1]; 
  13.         } 
  14.         L[l] = 32767; 
  15.         R[r] = 32767; 
  16.         l = 0; 
  17.         r = 0; 
  18.         for(i=0; i< e-b+1; i++) 
  19.         { 
  20.             if(L[l] < R[r]) 
  21.             { 
  22.                 A[b+i] = L[l]; 
  23.                 l ++; 
  24.             } 
  25.             else            { 
  26.                 A[b+i] = R[r]; 
  27.                 r ++; 
  28.             } 
  29.         } 
  30. void MERGE_SORT(int *A, int b, int e) 
  31.         if(b < e) 
  32.         { 
  33.             int m = (b + e) / 2; 
  34.             MERGE_SORT(A, b, m); 
  35.             MERGE_SORT(A, m+1, e); 
  36.             MERGE(A, b, m, e); 
  37.         } 
  38. int main() 
  39.         int A[500]; 
  40.         int lens, i; 
  41.         printf("Please Enter the lenghth of array:"); 
  42.         scanf("%d", &lens); 
  43.         printf("Please Enter the elements of the array:"); 
  44.         for(i=0; i< lens; i++) 
  45.             scanf("%d", &A[i]); 
  46.         MERGE_SORT(A, 0, lens-1); 
  47.        printf("the result of the sort is:\n"); 
  48.         for(i=0; i< lens; i++) 
  49.         { 
  50.             printf("%d ", A[i]); 
  51.         } 
  52.         return 0; 
时间: 2024-10-05 05:58:59

C语言实现合并排序的相关文章

C语言合并排序及实例代码_C 语言

归并排序也称合并排序,其算法思想是将待排序序列分为两部分,依次对分得的两个部分再次使用归并排序,之后再对其进行合并.仅从算法思想上了解归并排序会觉得很抽象,接下来就以对序列A[0], A[l]-, A[n-1]进行升序排列来进行讲解,在此采用自顶向下的实现方法. 操作步骤如下: (1)将所要进行的排序序列分为左右两个部分,如果要进行排序的序列的起始元素下标为first,最后一个元素的下标为last,那么左右两部分之间的临界点下标mid=(first+last)/2,这两部分分别是A[first

浅谈算法和数据结构 三 合并排序

合并排序,顾名思义,就是通过将两个有序的序列合并为一个大的有序的序列的方式来实现排序.合并排序是一种典型的分治算法:首先将序列分为两部分,然后对每一部分进行循环递归的排序,然后逐个将结果进行合并. 合并排序最大的优点是它的时间复杂度为O(nlgn),这个是我们之前的选择排序和插入排序所达不到的.他还是一种稳定性排序,也就是相等的元素在序列中的相对位置在排序前后不会发生变化.他的唯一缺点是,需要利用额外的N的空间来进行排序. 一 原理 合并排序依赖于合并操作,即将两个已经排序的序列合并成一个序列,

C++实现合并排序的方法_C 语言

本文实例讲述了C++实现合并排序的方法.分享给大家供大家参考.具体如下: //合并排序 #include<iostream> #include<cmath> using namespace std; int num[100]; void print(int num[],int len) { for(int i=0;i<len;i++) { cout<<num[i]<<" "; } cout<<endl; } void m

合并排序(C语言实现)_C 语言

其基本模式如下: 分解:把一个问题分解成与原问题相似的子问题 解决:递归的解各个子问题 合并:合并子问题的结果得到了原问题的解. 现在就用递归算法,采用上面的分治思想来解合并排序.                       合并排序(非降序) 分解:把合并排序分解成与两个子问题 伪代码: 复制代码 代码如下: MERGE_SORT(A, begin, end) if begin < end    then mid<- int((begin + end)/2)            MERGE

Ruby实现的合并排序算法_ruby专题

算法课的作业,利用分治法,合并排序. #encoding: utf-8 #author: xu jin, 4100213 #date: Oct 27, 2012 #MergeSort #to sort an array by using MergeSort algorithm #example output: #The original array is:[4, 32, 84, 58, 49, 40, 75, 29, 82, 21, 70, 37, 70] #The sorted array i

c语言-C语言选择法排序函数的实现问题

问题描述 C语言选择法排序函数的实现问题 我在看C语言程序设计是遇到一个问题,用选择法对数组中的5个整数按由小到大排序 #include int main() { void sort(int array[],int n); int a[5],i; printf("Please input 5 numbers:n"); for(i=0;i<5;i++) scanf("%d",&a[i]); sort(a,5); printf("the sort

Ruby实现的合并排序算法

  这篇文章主要介绍了Ruby实现的合并排序算法,本文直接给出实现代码,需要的朋友可以参考下 算法课的作业,利用分治法,合并排序. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 #encoding: utf-8 #author: xu jin, 4100213 #date: Oct 27, 2012 #MergeSort #to sort a

Javascript排序算法之合并排序的2个例子介绍

 这篇文章主要介绍了Javascript排序算法之合并排序(归并排序)的2个例子,需要的朋友可以参考下 归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.   归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列.   归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(

printf-c语言ASCII码排序 我的代码哪里有问题?

问题描述 c语言ASCII码排序 我的代码哪里有问题? 描述 输入三个字符后,按各字符的ASCII码从小到大的顺序输出这三个字符. 输入 输入数据有多组,每组占一行,有三个字符组成,之间无空格. 输出 对于每组输入数据,输出一行,字符中间用一个空格分开. 样例输入 qwe asd zxc 样例输出 e q w a d s c x z 我的代码是: #include int main() { char a[3],t; while(scanf("%c%c%c",&a[0],&