废话不多说,直接上菜。
归并排序的时间复杂度是O(nlogn)
思路就两步:
第一步:拿到一组无序的数组,先对半分成左右两块(不是偶数的个数,就一侧多一个,另一侧少一个)。然后再次进行划分,直到不能分解为止。
第二步:从最小的分解单元开始,两两有序合并。然后再次把合并后的数组,再两两有序合并,直到不能合并为止。
然后我们来看一下代码:(从下往上看:)
#include<iostream>
using namespace std;
void merge(int a[ ],int arr[ ],int left,int mid, int right)
{
int l=left; //标记左数组的头部下标
int p=left; //标记合并的数组的头部下标
int r=mid+1;//标记右数组的头部下标
while(l<=mid&&r<=right)
{
if(a[l]<a[r]) //从小到大排列
arr[p++]=a[l++];
else arr[p++]=a[r++];
}
while(l<=mid) //左数组没排完的话
arr[p++]=a[l++];
while(r<=right) //右数组没排完的话
arr[p++]=a[r++];
//到这里,left到right里面的数已经排列完了,不过都放在了辅助数组arr里面,现在需要做的就是把这些排好的数,覆盖原来的数组
while(left<=right)
{
a[left]=arr[left];
left++;
}
}
void msort(int a[ ],int arr[ ],int left,int right)
{
int mid=(left+right)/2;
if(left<right)
{
msort(a,arr,left,mid); //分解左数组
msort(a,arr,mid+1,right); //分解右数组
merge(a,arr,left,mid,right);//合并数组 这一步非常关键
}
}
void merge_sort(int a[ ],int n)
{
int *arr=(int *)malloc(n*sizeof(int)); //构造辅助数组
msort(a,arr,0,n-1); //分解数组
}
int main()
{
int n,a[10000]; //定义一下数组
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i]; //给数组赋值
merge_sort(a,n);
for(int i=0;i<n;i++)
cout<<a[i];
return 0;
}
很快的排序------归并排序
于 2022-02-27 18:04:36 首次发布