算法导论一——关于MergeSort(归并排序)总结
来源:互联网 发布:手机淘宝么注册网店 编辑:程序博客网 时间:2024/05/29 02:43
Merge_Sort总结
在这个算法中,思想相对简单:
1. 首先将原有序列分解为两个小的序列,分别进行排序
2. 使用同1中的方法对两个序列进行操作
3. 合并两个已排序序列,生成一个有序序列
main.c
int main(void){ //将a中从下标0到10的序列进行排序 Mergesort(a,0,10);}
mergesort.h
void Mergesort(int* a,int p,int r){//归并排序函数,p为排序下界,r为排序上界 int q = (p + r) / 2; //q为序列中间下标 if(p < r)//递归终止条件 {//若序列长度大于1,则分别对左右序列排序 Mergesort(a,p,q); //左边序列排序 Mergesort(a,q + 1,r); //右边序列排序 Merge(a,p,q,r); //合并左右得到有序序列 }}
void Merge(int* a,int p,int q,int r){//合并a中左右两个序列,上界r,下界p,分界点q //使用两个新的数组分别存放左右序列 int lenghtOfLarray = (q - p + 1); //左序列长度 int lengthOfRarray = (r - q); //右序列长度 //数组的最后一位作为哨兵,这样可以减少最后确认复制完成的操作步骤 //因为复制到最后的肯定不会大过INFINITY int larray[lengthOfLarray + 1]; int rarray[lengthOfRarray + 1]; //将a中从p到r之间的元素分别复制到左数组中 for(int i = 0 ; i < lengthOfLarray ; ++i) { larray[i] = a[p + i]; //从p开始复制 } larray[lengthOfLarray + 1] = INFINITY; //将a中从p到r之间的元素分别复制到右数组中 for(int i = 0 ; i < lengthOfRarray ; ++i) { rarray[i] = a[q + 1 + i]; //从q的下一位开始复制 } rarray[lengthOfRarray + 1] = INFINITY; //将两个序列中的内容再合并到a中形成有序: int l = 0; //左数组下标指针 int r = 0; //右数组下标指针 for(int i = 0;i < r - p + 1;++i) {//总共有p~r的元素需要复制,故是r-p+1 if( larray[l] < rarray[r] ) {//哪个序列中的小就复制到a中 a[p + i] = larray[l++]; } else { a[p + i] = rarray[r++]; } }}
0 0
- 算法导论一——关于MergeSort(归并排序)总结
- 归并排序算法 MergeSort
- 【算法导论学习-002】归并排序(MergeSort)
- 算法导论——归并排序
- 算法导论笔记——归并排序
- 算法导论例程——归并排序
- 算法导论——归并排序
- 归并排序——算法导论学习
- 算法导论—归并merge排序
- 再读算法导论关于归并排序
- 算法-排序-归并排序(MergeSort)分析
- 排序算法 之 归并排序 MergeSort
- Java排序算法--归并排序(MergeSort)
- 排序算法--归并排序(MergeSort)
- 算法学习—002—js实现归并排序—mergeSort
- 【从零学习经典算法系列】分治策略实例——归并排序(Mergesort)
- 十大基础实用算法补全——归并排序(MergeSort)
- 归并排序算法MergeSort in C#
- 多重背包二进制
- java实用教程
- java第二十五节-多线程socket通信
- 面试大全1
- Java的位运算符详解实例——与(&)、非(~)、或(|)、异或(^)
- 算法导论一——关于MergeSort(归并排序)总结
- 设计模式之职责链模式
- Material Design 实现之主题使用Theme
- POJ2387 Til the Cows Come Home
- Linux系统中校验下载文件的完整性方法(MD5,SHA1,PGP)
- 斯坦福大学深度学习与自然语言处理第三讲:高级的词向量表示
- Ubuntu 输入正确的密码后重新返回到登陆界面
- 文件与流
- Scala 之 trait 关键字