标签:归并 end int arr mid 数组 front 排序
需要额外空间的外部排序?
菜鸟教程版本
这个版本的写法很不一样,
- 首先,它每次都copy构造了两个子数组,然后再从这两个子数组中挑元素往原数组放
- 构造的两个子数组容量都+1,并且设置末尾值为max值,为了比较大小的时候方便
// 合并操作
void Merge(vector<int>& arr, int front, int mid, int end) {
// 这是个什么构造方式,是类似于传入一个vector,然后copy一份对吧
vector<int> LeftSubArr(arr.begin() + front, arr.begin() + mid + 1);// 左半部分数组,注意这里额外加了1
vector<int> RightSubArr(arr.begin() + mid + 1, arr.begin() + end + 1);// 右半部分数组,这里
// 左半部分的指针和右半部分的指针
int idxLeft = 0, idxRight = 0;
// 后面的意思是返回编译器允许的int最大值
// 在数组末尾插入int最大值?
LeftSubArr.insert(LeftSubArr.end(), numeric_limits<int>::max());
RightSubArr.insert(RightSubArr.end(), numeric_limits<int>::max());
// Pick min of LeftSubArray[idxLeft] and RightSubArray[idxRight], and put into Array[i]
for (int i = front; i <= end; i++) {
if (LeftSubArr[idxLeft] < RightSubArr[idxRight]) {
arr[i] = LeftSubArr[idxLeft];
idxLeft++;
}
else {
arr[i] = RightSubArr[idxRight];
idxRight++;
}
}
}
// 手写归并排序
// 待排序的数组,待排序序列的起始下标、结束下标
void MergeSort(vector<int>& arr, int front, int end) {
if (front >= end) return;// 当数组长度不合法或者数组长度为1时不理会
int mid = (front + end) / 2;
MergeSort(arr, front, mid);// 处理左半边
MergeSort(arr, front, mid);// 处理右半边
Merge(arr, front, mid, end);
}
标签:归并,end,int,arr,mid,数组,front,排序 来源: https://www.cnblogs.com/yaocy/p/16387362.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。