归并排序:
归并的意思是将两个数组合成为一个,而归并排序就是:将一个数组分为许多个,让多个数组按大小归并,直到归并为一个;
基本思想为:
将一个数组拆分为许多个两两结合的数组,然后逐步排序
主要函数是将两个分开的数组排序成一个数组,需要两个指针指向两个数组开头,每次排列进去最小的数字;
需要递归函数和归并函数
递归函数:
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;//初始化bfor(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;//初始化bfor(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;
}