归并排序分析
admin
2024-05-02 21:24:33
0

目录

🥝 原理介绍:

🥝 特点:

🥝 代码示例:

🥝 算法复杂度:

🥝 改进方案:


🥝 原理介绍:

归并排序就是将两个或两个以上的有序表合并成一个有序表的过程。将两个有序表合并成一个有序表的过程称为2-路归并。

🥝 特点:

  1. 稳定性:归并排序是一种稳定的排序算法,它保证相同的元素在排序后相对位置不变。

  2. 效率:归并排序是一种较快的排序算法,在排序大型数据时,它的效率很高。

  3. 适用范围:归并排序适用于排序数据规模较大的情况,因为它的常数较小,在排序大型数据时,它的效率很高。

🥝 代码示例:

递归代码:

/***************************************************************** @description: merge sort* @author: kashine* @version: 1.0* @mail: likaiqinchina@gmail.com* @date: 2022/12/29
*/
#include 
#include using namespace std;void merge(vector& array, int start, int mid, int end)
{// [start, mid]左侧有序, [mid + 1, end]右侧有序int n1 = mid - start + 1;// 左侧有序int n2 = end - mid;// 右侧有序// 将左右侧有序部分分别存储到temp1,temp2中vector temp1, temp2;int i = 0, j = 0;while(i < n1)temp1.emplace_back(array[start + i++]);while(j < n2)temp2.emplace_back(array[mid + 1 + j++]);// 将temp1,temp2按顺序归并到array中i = 0; j = 0;int k = start;// 注意:k不能等于0!!!while(i < n1 && j < n2){if(temp1[i] < temp2[j]){array[k++] = temp1[i++];}else{array[k++] = temp2[j++];}}// 将剩余元素拷贝到array中while(i < n1)array[k++] = temp1[i++];while(j < n2)array[k++] = temp2[j++];}// 归并排序
// start为排序起始下标,end为排序终止下标
// 二路归并实现排序,分治法(左、右)
void merge_sort(vector& array, int start, int end)
{if(start < end)// 如果start大于或者等于end,不进行处理,即当数组只有一个元素不做处理{int mid = (start + end) / 2;merge_sort(array, start, mid);merge_sort(array, mid + 1, end);merge(array, start, mid, end);}
}int main()
{vector array{5, 2, 4, 6, 1, 3};merge_sort(array, 0, array.size() - 1);for(auto& it : array){cout<< it << " ";}cout<

非递归代码:

/***************************************************************** @description: merge sort* @author: kashine* @version: 1.0* @mail: likaiqinchina@gmail.com* @date: 2022/12/29
****************************************************************/
#include 
#include using namespace std;void merge(vector& array, int start, int mid, int end)
{// [start, mid]左侧有序, [mid + 1, end]右侧有序int n1 = mid - start + 1;// 左侧有序int n2 = end - mid;// 右侧有序// 将左右侧有序部分分别存储到temp1,temp2中vector temp1, temp2;int i = 0, j = 0;while(i < n1)temp1.emplace_back(array[start + i++]);while(j < n2)temp2.emplace_back(array[mid + 1 + j++]);// 将temp1,temp2按顺序归并到array中i = 0; j = 0;int k = start;// 注意:k不能等于0!!!while(i < n1 && j < n2){if(temp1[i] < temp2[j]){array[k++] = temp1[i++];}else{array[k++] = temp2[j++];}}// 将剩余元素拷贝到array中while(i < n1)array[k++] = temp1[i++];while(j < n2)array[k++] = temp2[j++];}void mergeSort(vector& arr) {int n = arr.size();for (int curr_size = 1; curr_size <= n - 1; curr_size = 2 * curr_size) {for (int left_start = 0; left_start < n - 1; left_start += 2 * curr_size) {int mid = left_start + curr_size - 1;int right_end = std::min(left_start + 2 * curr_size - 1, n - 1);merge(arr, left_start, mid, right_end);}}
}int main() {vector arr = {38, 27, 43, 3, 9, 82, 10};mergeSort(arr);for (int i = 0; i < arr.size(); i++)std::cout << arr[i] << " ";std::cout << std::endl;return 0;
}

🥝 算法复杂度:

合并复杂度O(n),分治复杂度:T(n) = 2T(n/2) + O(n),类似于快速排序每一次取到的元素都刚好平分整个数组的情况。详细推导见:快速排序时间复杂度分析 - 知乎排序算法之 快速排序 及其时间复杂度和空间复杂度

时间复杂度:O(nlog2n)

时间复杂度:O(nlog2n)

空间复杂度:O(n)

因为不管元素在什么情况下都要做这些步骤,所以花销的时间是不变的,所以该算法的最优时间复杂度和最差时间复杂度及平均时间复杂度都是一样的为:O( nlogn )。

详见排序算法之 归并排序 及其时间复杂度和空间复杂度

🥝 改进方案:

归并排序的时间复杂度为O(nlgn),一般来讲,基于从单个记录开始两两归并的排序并不是特别提倡,一 种比较常用的改进就是结合插入排序,即先利用插入排序获得较长的有序子序列,然后再两两归并(改进后的归并仍是稳定的,因为插入排序是稳定的)。

相关内容

热门资讯

奉献爱心的成语 奉献爱心的成语春风送暖 体贴入微 无微不至 雪中送炭关怀备至嘘寒问暖
安徒生在1827年发表过《垂死... 安徒生在1827年发表过《垂死的小孩》这篇文章吗问一下、帮帮忙!《垂死的小孩》是一首诗,是安徒生18...
跆拳道比赛的进攻技术是怎样的? 跆拳道比赛的进攻技术是怎样的?跆拳道比赛的进攻技术跆拳道比赛的进攻技术包括拳攻和踢法进攻两类。现代竞...
本人书荒,求几本书 本人书荒,求几本书我最近在看紫玉钗街诡怪传说。我觉得还不错
情玫公寓和紫色蜜桃哪个更加好 ... 情玫公寓和紫色蜜桃哪个更加好 会不会有什么问题 里面的女的是不是都是莫须有的都是骗人的,想骗取你的钱...
求一早期的动画片名称,每集一个... 求一早期的动画片名称,每集一个单独故事,似乎是世界怪异故事集还有一组头发的女主人公为了买礼物的演员卖...
无双大蛇各武将的终极武器是什么... 无双大蛇各武将的终极武器是什么名字?正在收集终极武器,已经弄到赵云.周泰.织田信长的.其他武将的终极...
你觉得,你们遇到最无奈的时候,... 你觉得,你们遇到最无奈的时候,是什么时候?一个男人最无奈的时候就是在最没能力的时候遇到最想照顾的人,...
我们常把那些对事物只有一知半解... 我们常把那些对事物只有一知半解却喜欢在人前卖弄的人叫做什么哦,这种人我们这里叫半吊子,就是半瓶醋,一...
砸锅卖铁去上学谁是背后反派 砸锅卖铁去上学谁是背后反派 肖伊莱。《砸锅卖铁去上学》是由奇迹文学城作者红刺北写作的一篇女强爽文...
为什么让我漩涡中挣脱 为什么让我漩涡中挣脱这个还是你自己的心理的想法,想开,自然好了
苍山洱海的任务从哪儿开始做啊 苍山洱海的任务从哪儿开始做啊从地图的右上方莫雨少爷开始任务。地图北边路口
如果你可以选择自己的人生道路,... 如果你可以选择自己的人生道路,你会如何抉择?我会选择从初中就开始奋斗的一种人生道路,不过是那种见过世...
哪种五笔好? 哪种五笔好?用万能五笔啊功能更强大!五笔加加 搜狗呵呵,建议你使用极点五笔。。。。敲一下空格,能切换...
为什么和陈伟霆一样帅的人 总是... 为什么和陈伟霆一样帅的人 总是被女生盯着看?反而女生不敢和他说话爱美之心人皆有之啊和陈伟霆一样帅的人...
算命能不能改命 算命能不能改命算命的不能够改命,你没听说过有一句话吗,三分天注定,七分靠打拼,也就是说有三分就是靠天...
谁知道赛尔号怎么进入夜魔古堡 谁知道赛尔号怎么进入夜魔古堡登录赛尔号,打开左上角的航行日志,选择右侧栏第一个圣甲永夜,再点击图中间...
爱情公寓5里人人都爱吕小布是哪... 爱情公寓5里人人都爱吕小布是哪一集?爱情公寓5里人人都爱吕小布,是在第13集上。有好几集都有好像在3...
不败是什么意思? 不败是什么意思?包含成功和从未挑战两种意思
叔向见韩宣子中栾武子等人的事例... 叔向见韩宣子中栾武子等人的事例。分析刘禹锡和韩宣子为人的异同刘禹锡是一个洁身自好的人,韩宣子是一个清...