算法分析——分治思想之合并排序
来源:互联网 发布:编程语言历史发展 编辑:程序博客网 时间:2024/05/22 17:37
根据分治策略,我们创建了合并排序算法,合并排序算法的基本思想是:将待排序元素分成大小大致相同的两个子集合分别对两
个子集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合。
换句话说,将一个数组两个两个结合并排序,形成小范围有序的新的数组,再将新的数组四个四个结合,在此形成新的数组以此
类推,最终实现整个数组的有序。
实现该算法时,首先应该顾名思义,先合并在排序,故当思考时,我们应该将该问题划分为两个子函数——合并函数以及排序函
数。首先,我们先考虑如何实现合并这一函数,根据算法的思想,将待排序元素分成大小大致相同的两个子集,故此,我们应该
考虑以下几点:
1、如何将一个有序的数组分成两个大小大致相同的子集。
2、如何保存分好的数组
于是在创建函数时,我们首先引入一个变量s作为控制分组的变量来解决第一小点,然后我们在原有数组a的基础上引入一个新的数组b
通过数组a,b两个数组的循环使用来保存分好的数组成功解决第二小点
之后我们便可以开始创建合并排序算法
#include<iostream>using namespace std;//合并排序算法 void mergeSort(int a[]){int b[]=new int[strlen(a)];int s=1;//通过s来控制每次分组的大小 while(s<strlen(a))//当s的大小等于数组长度时即代表排序结束 {mergePass(a,b,s);//循环利用数组a,b来保持新排序好的数组 s+=s;mergePass(b,a,s);s+=s;} } //合并方法 void mergePass(int a[],int b[],int s) { for(int i=0;i<strlen(a)-2*s;i+2*s)//i控制分组的循环,当剩余的元素不足以进行下次两两合并时,循环结束 { merge(a,b,i,i+s-1,i+2*s-1);//排序(通过直接传递数组下标,便捷后面的多于处理中的排序) } if(s>strlen(a))//处理多余的数组元素 ,当多余元素大于一个分组时 { merge(a,b,i,i+s-1,i+strlen(a)-1); } else//当多余数组少于一个分组时 for(int j=i;j<strlen(a);j++) { b[j]=a[j]; } }
作为合并的方法后,我们得到了两个两个一组的未排序的数组,于是我们通过一个简单对比较排序即可得到排序好的新的结合在一起的数组
void merge(int a[],int b[],int l,int m,int n) {int i=m;int j=m+1;int k=l;while((i<=m)&&(j<=n)){if(a[i]<=c[j]){b[k++]=a[i++];elseb[k++]=a[j++];}}if(i>m){for(int q=j;q<=n;q++){d[k++]=c[q];}}else{for(int q=i;q<=m;q++){d[k++]=c[q];}} }
阅读全文
0 0
- 算法分析——分治思想之合并排序
- 算法分析——分治思想之快速排序
- 分治算法—合并排序
- 分治思想之排序算法
- 分治算法之合并排序
- 合并排序,分治思想
- 排序算法大集锦_合并排序_1(分治思想)
- 算法之分治思想和快速排序
- 算法设计与分析之分治思想
- 分治算法-合并排序
- 【算法学习】归并排序——基于分治思想
- 【算法】快速排序——基于分治思想的实现
- 分治——合并排序
- 基础算法 —— 合并排序(分治法)
- 0004算法笔记——【分治法】合并排序
- 0004算法笔记——【分治法】合并排序
- 04算法笔记——【分治法】合并排序
- 算法笔记——【分治法】合并排序
- 1058. A+B in Hogwarts (20)
- 编码相关整理
- HTML和CSS
- java的String类中的方法
- spring boot集成mysql(二)
- 算法分析——分治思想之合并排序
- VS2013+Qt5.7.1调用第三方库
- Leetcode 4. Median of Two Sorted Arrays[Hard]
- mqtt实现自动监听服务器消息
- gradle 如何引入constraintlayout依赖
- C++数组连接求能被7整除的数
- java,jsp当前上下文是什么意思
- 今年暑假不AC(贪心)
- [题解] HDU 2196 Computer(树型DP)