android網路程式設計基礎(kotlin語法)一
阿新 • • 發佈:2020-12-28
技術標籤:演算法
歸併排序的思想是先分塊,再合併。這樣能大大降低複雜度
分塊的複雜度是logn,合併的複雜度是n,因此總複雜度為nlgn
具體可以看程式碼的註釋
#include<iostream>
#include<algorithm>
typedef long long ll;
using namespace std;
int a[(int)1e5+5],tmp[(int)1e5+5];
ll ans=0;
void merge(int l,int r)
{
//合併時,l到mid,mid+1到r已經排好序了
//就只需要用兩個類似指標的int,和一個tmp陣列進行l到r的排序
int mid=(l+r)/2;
int p1=l,p2=mid+1;
int k=l;
while(k<=r)
{
//誰小就把值賦給當前的tmp[k],
//或者一邊的已經分配完了,那麼就全給另一邊
if((p2<=r&&a[p1]>a[p2])||p1>mid)
tmp[k++]=a[p2++];
else
tmp[k++]=a[p1++];
}
//將tmp賦給a
for(int i=l;i<=r;++i)
a[i]=tmp[i];
return;
}
void divide(int l,int r)
{
if(l>=r)
return;
int mid=(l+r)/2;
divide(l,mid);
divide(mid+1,r);
merge(l,r);
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;++i)
scanf("%d",&a[i]);
divide(0,n-1);
cout<<ans<<endl;
}