重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
定义:归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
创新互联主营振安网站建设的网络公司,主营网站建设方案,App定制开发,振安h5微信小程序搭建,振安网站营销推广欢迎振安等地区企业咨询简单的来说,归并排序主要分为三步,一是对数组的划分,二是对数组的排序,三是对数组的合并。划分的大小是可以随自己的想法而设置,但是一般都是以2为单位,这样最小的一组的排序就比较方便。
具体一个简单的例子:
设有数列{6,202,100,301,38,8,1}
初始状态:6,202,100,301,38,8,1
第一次归并后:{6,202},{100,301},{8,38},{1},比较次数:3;
第二次归并后:{6,100,202,301},{1,8,38},比较次数:4;
第三次归并后:{1,6,8,38,100,202,301},比较次数:4;
总的比较次数为:3+4+4=11;
逆序数为14;
在利用算法实现的时候,需要利用递归的思想,函数的入口是整个数组,不断进行划分,直到划分的数组只剩下一个或两个元素为止,对这一组进行排序后,再按原来划分的大小还原并排序,这里利用一个新的数组比较方便,将两个排序后的数组,再从小到大一个一个放入新的数组。
具体代码:
#include#include using namespace std; void merge(int *data,int start,int end,int *result) { int left_length = (end - start + 1) / 2 + 1; int left_index = start; int right_index = start + left_length; int result_index = start; while(left_index data[end]) { int temp = data[start]; data[start] = data[end]; data[end] = temp; } return; } else if (end == start) return; //last one element then there is no need to sort; else{ //continue to divide the interval merge_sort(data, start, (end - start + 1) / 2 + start, result); merge_sort(data, (end - start + 1) / 2 + start + 1, end, result); //start to merge sorted data merge(data, start, end, result); for (int i = start; i <= end;++i) { data[i] = result[i]; } } } //example int main() { int data[] = {5,3,6,7,3,2,7,9,8,6,34,32,5,4,43,12,37}; int length = 17; int result[length]; cout << "before sorted:"<<'\n'; for (int i = 0; i < length;i++) cout << data[i]<<' '; cout << '\n' << "after sorted:"<<'\n'; merge_sort(data, 0, length - 1, result); for (int i = 0; i < length;i++) cout << result[i]<<' '; return 0; }
另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。