博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
合并排序(C语言实现)
阅读量:4680 次
发布时间:2019-06-09

本文共 2067 字,大约阅读时间需要 6 分钟。

递归算法是把一个问题分解成和自身相似的子问题,然后再调用自身把相应的子问题解决掉。这些算法用到了分治思想。其基本模式如下:

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

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

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

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

                      合并排序(非降序)

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

伪代码:

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)

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

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

       

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

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

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

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

       

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

 代码奉上:

#include 
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]; } for (i=0; i< r; i++) { R[i] = A[m+i+1]; } 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 ++; } }} 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); }}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]); } return 0;}

 

转载于:https://www.cnblogs.com/kaituorensheng/archive/2013/02/21/2919934.html

你可能感兴趣的文章
Nginx 常用命令总结
查看>>
hall wrong behavior
查看>>
Collection集合
查看>>
【C++】const在不同位置修饰指针变量
查看>>
github新项目挂历模式
查看>>
编写jquery插件
查看>>
敏捷开发笔记
查看>>
学前班
查看>>
关于自关联1
查看>>
hdu-1814(2-sat)
查看>>
谷歌浏览器,添加默认搜索引擎的搜索地址
查看>>
数据结构化与保存
查看>>
为什么需要Docker?
查看>>
国内5家云服务厂商 HTTPS 安全性测试横向对比
查看>>
how to control project
查看>>
转 python新手容易犯的6个错误
查看>>
第四节 -- 列表
查看>>
决策树
查看>>
团队作业
查看>>
如何避免在简单业务逻辑上面的细节上面出错
查看>>