1. 程式人生 > 實用技巧 >android網路程式設計基礎(kotlin語法)一

android網路程式設計基礎(kotlin語法)一

技術標籤:演算法

歸併排序的思想是先分塊,再合併。這樣能大大降低複雜度
分塊的複雜度是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; }