#include<iostream>
#include<ctime>
#define MAX 20
using namespace std;
/* 归并排序
归并排序的思想在于把一个无序序列拆解成单个元素的序列,再把拆分的序列中的元素按大小放置在一个辅助数组中
然后把辅助序列中的元素拷贝至序列的原位置递归完成排序
*/
void _sort(int* arr, int loc_1, int loc_2, int loc_3, int loc_4); //合并数组
void init_arr(int* arr); //初始化数组
void merge_sort(int* arr, int loc_1, int loc_2); //归并排序
//初始化数组
void init_arr(int* arr)
{
srand((unsigned int)time(NULL));
for (int i = 0; i < MAX; i++) { arr[i] = rand() % 1000;}
}
//数组遍历
void print(int arr[], int max)
{
for (int i = 0; i < max; i++) { cout << arr[i] << " "; }
cout << endl;
}
//归并排序
void merge_sort(int *arr, int loc_1, int loc_2)
{
//拆解
if (loc_1 >= loc_2) { return; }
int i = loc_1; //起始位置
int k = loc_2; //结束位置
int mid = loc_1 + (loc_2 - loc_1) / 2; //中间位置
merge_sort(arr,i, mid); //把拆分后的前半段递归
merge_sort(arr,mid + 1, k); //后半段递归
//合并
_sort(arr,i, mid, mid + 1, k);
}
//合并数组
void _sort(int* arr,int loc_1, int loc_2, int loc_3, int loc_4)
{
int k = loc_4 - loc_1 + 1; //传入区间的元素的个数
int* temp = new int[k]; //辅助数组
int x = loc_1; //记录前序列的起始位置
int y = loc_3; //记录后序列的起始位置
int i = 0; //记录辅助数组的下标
while (x <= loc_2 && y <= loc_4 && i < k) //初始化辅助数组
{
if (arr[x] > arr[y]) { temp[i] = arr[y]; y++; i++; }
else { temp[i] = arr[x]; x++; i++; }
}
if (x > loc_2 && y <= loc_4) //前一序列完全传入但后一序列并未完全传入
{
while (y <= loc_4 && i < k) { temp[i] = arr[y]; y++; i++; }
}
else if (y > loc_4 && x <= loc_2) //后一序列完全传入但前一序列并未完全传入
{
while (x <= loc_2 && i < k) { temp[i] = arr[x]; x++; i++; }
}
for (int j = 0; j < k; j++) //辅助数组的值拷贝至原数组对应位置中
{
arr[loc_1] = temp[j];
loc_1++;
}
delete[]temp; //释放辅助数组
}
int main()
{
int arr[MAX] = { 0 };
init_arr(arr);
print(arr, MAX);
merge_sort(arr, 0, MAX - 1);
print(arr, MAX);
system("pause");
return 0;
}
排序-归并排序
于 2022-05-20 18:30:41 首次发布