#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
void merge(int num[], int left, int right, int mid)
{
// 比较左右两边第一个未排序的数字,放入临时数组,最后把临时数组排好序的复制到原数组
// 设置临时数组
int num_[10];
// 设置临时数组下标,每次排序范围都是传入的(left ~ right)
int i_ = left;
// 左右进度可能不一样,需要标记左右第一个未排序数字
// 设置左半部分第一个未排序数字
int i = left;
// 设置右半部分第一个未排序数字
int j = mid+1;
// 比较左右第一个未排序数字
while (i <= mid && j <= right) {
if (num[i] < num [j]) {
num_[i_++] = num[i++];
} else {
num_[i_++] = num[j++];
}
}
// 可能有一边存完了,另一边还剩了数字,所以直接放入
// 左
while (i <= mid) {
num_[i_++] = num[i++];
}
// 右
while (j <= right) {
num_[i_++] = num[j++];
}
// 把临时数组的值复制到原来数组,覆盖
for (int i=left; i<= right; i++) {
num[i] = num_[i];
}
}
void mergeSort(int num[], int left, int right) // 每部分作为(left ~ right)传入
{
// 归并排序 先划分,再合并
// 划分
if (left < right) {
int mid = (left + right) / 2;
// 左半部分,left ~ mid
mergeSort(num, left, mid);
// 右半部分,mid+1 ~ right
mergeSort(num, mid+1, right);
// 最底层是左1,右1个,然后排序后合并
merge(num, left, right, mid);
}
}
int main()
{
int num[10];
// 随机函数
srand((unsigned)time(NULL));
for (int i=0; i<10; i++) {
num[i] = rand()%10+1; //max加 1
}
// 输出
cout<<"归并排序前:"<<endl;
for (int i=0; i<10; i++) {
cout<<num[i]<<" ";
}
cout<<endl;
// 归并排序
mergeSort(num, 0, 9); // 注意:右下标传入N-1
// 输出
cout<<"归并排序后:"<<endl;
for (int i=0; i<10; i++) {
cout<<num[i]<<" ";
}
cout<<endl;
return 0;
}
常用代码_归并排序
最新推荐文章于 2024-07-01 22:50:26 发布