归并排序:
归并的意思是将两个数组合成为一个,而归并排序就是:将一个数组分为许多个,让多个数组按大小归并,直到归并为一个;
基本思想为:
将一个数组拆分为许多个两两结合的数组,然后逐步排序
主要函数是将两个分开的数组排序成一个数组,需要两个指针指向两个数组开头,每次排列进去最小的数字;
需要递归函数和归并函数
递归函数:
void Merge_sort(int *a,int low,int hight)
{
if(low < hight)
{
int mid = (low+hight)/2;
Merge_sort(a,low,mid);
Merge_sort(a,mid+1,hight);
Merge(a,low,hight,mid);
}
}
递归结束条件是low < hight,也就是最小为2的数组,而如果数组总长度小于1就会不做任何排序
递归函数的作用是将数组按顺序拆分为两个两个的好多对数字,
然后将这两个数字看作一个数组,和另一对数组排序(两个指针指向两个数组开头,每次排列进去最小的数字);
归并函数:
int Merge(int *a,int low,int hight,int mid)
{
//利用b来给a赋值
int b[hight+1];
int i,j,k = low;
//初始化b
for(i = 0;i < hight+1;++i)
{
b[i] = a[i];
}
//将两个有序数组排列为一个
for(i = low,j = mid+1;i <= mid && j <=hight;++k)
{
if(b[i] > b[j])
{
a[k] = b[j];
++j;
}
else
{
a[k] = b[i];
++i;
}
}
//可能有剩余
while(i <= mid)
{
a[k++] = b[i++];
}
while(j <= mid)
{
a[k++] = b[j++];
}
}
可以看到这里是用新建数组的方法对两个数组按大小进行归并;
两个排序完后排序四个的,逐步递归,直到完成最开头的Merge函数,排序结束
c++代码如下:
#include <bits/stdc++.h>
using namespace std;
int Merge(int *a,int low,int hight,int mid)
{
//利用b来给a赋值
int b[hight+1];
int i,j,k = low;
//初始化b
for(i = 0;i < hight+1;++i)
{
b[i] = a[i];
}
//将两个有序数组排列为一个
for(i = low,j = mid+1;i <= mid && j <=hight;++k)
{
if(b[i] > b[j])
{
a[k] = b[j];
++j;
}
else
{
a[k] = b[i];
++i;
}
}
//可能有剩余
while(i <= mid)
{
a[k++] = b[i++];
}
while(j <= mid)
{
a[k++] = b[j++];
}
}
void Merge_sort(int *a,int low,int hight)
{
if(low < hight)
{
int mid = (low+hight)/2;
Merge_sort(a,low,mid);
Merge_sort(a,mid+1,hight);
Merge(a,low,hight,mid);//将两个有序数组进行归并
}
}
void print_arr(int *arr,int size)
{
for(int i = 0;i < size;++i)
{
cout << arr[i];
if(i != size-1)
{
cout << " ";
}
}
}
int main()
{
int n;
cin >> n;
int arr[n];
for(int i = 0;i < n;++i)
{
cin >> arr[i];
}
Merge_sort(arr,0,n);
print_arr(arr,n);
cout << endl;
}
标签:sort,归并,int,hight,mid,Merge,low,数组
From: https://blog.csdn.net/2301_76783671/article/details/139564879