本文介绍: ① 将序列每相邻两个数字进行归并操作,形成floor(n/2)个序列,排序后每个序列包含两个元素。② 将上述序列再次归并,形成floor(n/4)个序列,每个序列包含四个元素。③ 重复步骤②,直到所有元素排序完毕。
实现逻辑
① 将序列每相邻两个数字进行归并操作,形成floor(n/2)个序列,排序后每个序列包含两个元素
② 将上述序列再次归并,形成floor(n/4)个序列,每个序列包含四个元素
③ 重复步骤②,直到所有元素排序完毕
void print_array(int a[], int n){
for (int i = 0; i < n; ++i){
cout << a[i] << " ";
}
cout << endl;
}
/************************************************************************
* 功能描述:二路归并排序(两个有序序列)
* 参 数:有序序列下标 f 第一个, s 第二个
* 日 期:2023/11/22
************************************************************************/
void merge(int arr[], int fBegin, int fEnd, int sBegin, int sEnd, int newArray[])
{
int index = fBegin;//新数组的下标
int f = fBegin;//遍历第一个有序序列
int s = sBegin;//遍历第二个有序序列
while (f <= fEnd && s <= sEnd)
{
if (arr[f] <= arr[s])
{
newArray[index++] = arr[f++];
}
else
{
newArray[index++] = arr[s++];
}
}
while (f <= fEnd)
{
newArray[index++] = arr[f++];
}
while (s <= sEnd)
{
newArray[index++] = arr[s++];
}
memcpy(arr + fBegin, newArray + fBegin, sizeof(int) *(sEnd - fBegin +1));
}
//多路归并排序
void mergeSort(int arr[], int left, int right, int newArray[])
{
if (left >= right)
{
return;
}
int mid = (left + right) / 2;
mergeSort(arr, left, mid, newArray);
mergeSort(arr, mid + 1, right, newArray);
merge(arr, left, mid, mid + 1, right, newArray);
}
int main(){
int arr[] = {10, 8, 11, 7, 4, 12, 9, 6, 5, 3};
int len = sizeof(arr)/sizeof(arr[0]);
int newArray[10] = {0};
cout << "排序前:";
print_array(arr, len);
mergeSort(arr, 0, len - 1, newArray);
cout << "排序后:";
print_array(arr, len);
return 0;
}
输出结果:
原文地址:https://blog.csdn.net/YHB123___ahnd/article/details/134548548
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_3070.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。