数据结构:归并排序
C++开发环境配置V3.0实验目的:因整课学习需要,并便利学生满足同样环境下的开发需要,特此设定本实验。推荐使用云主机的好处有以下内容:环境统一,不必费心于解决由于不同环境引起的各种问题云主机拥有公网IP,在后续的课程中部分任务需要使用到公网IP更换系统、重置操作相较于本地更容易配置,步骤简单推荐配置环境:Mac + 阿里云主机Linux + 阿里云主机Windows + Xshell +阿里云主
·
直观感受请点击视频观看:
参考视频
归并排序:
是创建在归并操作上的一种有效的排序算法。算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。归并排序思路简单,速度仅次于快速排序,为稳定外部排序算法,一般用于对总体无序,但是各子项相对有序的数列。基本思想
:采取分治,归并的思想,主要采取三个步骤:
1:分解:将序列中待排序数列分为若干个组
2:将若干个组合并,每次比较左右数列头部谁更小(更大),移动进新数列,再比较两组数据的头部,保证数列有序(重点)
3:重复第2步操作,直到只剩下一组数列,排序完成
分解如下图:合并优化
:并不需要分解为单个元素,只要待排序元素<=2个就可以排序了
代码参考:
//递归思想实现归并排序
void merge_sort(int *num,int l,int r){ //那段空间
//1.考虑边界条件:出口
if(r - l <= 1){ //两个及两个以内的元素,整个待排序的空间r-l
if(r - l == 1 && num[r] < num[l]) {
swap(num[r],num[l]);
}
return ;
}
//回溯:二路取中法
int mid = (l + r) >> 1;
merge_sort(num, l ,mid);//左半段
merge_sort(num, mid + 1, r);//右半段
int *temp = (int *)malloc(sizeof(int)*(r - l + 1)); //合并两个有序的数组
int p1 = l,p2 = mid + 1,k = 0;//分别为第一第二段头元素位置,和当前temp的位置
while(p1 <= mid ||p2 <= r){ //还有待排元素
if(p2 > r||(p1 <= mid && num[p1] <= num[p2])){ //第二段没元素了
temp[k++] = num[p1++];//插入左半段的元素
} else {
temp[k++] = num[p2++];//插入右 u半段的元素
}
}
memcpy(num + l,temp,sizeof(int) * (r - l + 1));//内存拷贝,拷贝到原数组
free(temp);
return ;
}
更多推荐
活动日历
查看更多
直播时间 2025-02-26 16:00:00


直播时间 2025-01-08 16:30:00


直播时间 2024-12-11 16:30:00


直播时间 2024-11-27 16:30:00


直播时间 2024-11-21 16:30:00


目录
所有评论(0)