程式設計求逆序數

2021-08-19 17:48:22 字數 1509 閱讀 9150

程式設計求逆序數

逆序數,也就是乙個排列中當某一對元素的先後次序與標準次序(從小到大)不同時,就說它構成乙個逆序。

如:3 5 2 1 4 的逆序數:2+3+1+0+0=6   ,3與2,1; 5與2,1,4; 2與1,就是找出排列第i個數後有幾個比它小的數,有幾個就有幾個逆序數,遍歷該排列,找出所有逆序數並求和就是該排列的總逆序數。

話不多說,直接上**

#includeint count=0; 

int main();

for(int i = 0; i < n; i++)

for(int j = i; j < n; j++)

printf("count = %d\n",count);

return 0;

}

上述方法的時間複雜度為o(n^2)

下面是基於歸併排序的求逆序數的方法,比較關鍵的步驟是合併,合併步驟是將已兩個排好序的陣列進行合併,當a[i]>a[j]時,i到mid間的數都大於a[j],把a[j]放到a[i]前面時,就產生了mid-i+1個逆序數,此時做累加記錄,若a[i]#define n 10

int count = 0;

void merge(int a,int left,int mid,int right)

else

k++; }

while(i<=mid)

b[k++] = a[i++];

while(j<=right)

b[k++] = a[j++];

for(int t = left;t<=right; t++)

a[t] = b[t];}

void reverse_count(int a,int left,int right)

int mid = left + (right-left)/2;

nixu(arr,left,mid);

nixu(arr,mid+1,right);

merge(arr,left,mid,right);

}public void merge(arraylistarr,int left,int mid,int right)else

}while(p<=mid)

while(q<=right)

for(int i=0;iarr = new arraylist<>();

for(int i=0;iarr.size())

while(leftarr.get(q))

// }

// }

arraylistarr1 = new arraylist<>(arr);

solusion2.nixu(arr,0,arr.size()-1);

system.out.println(solusion2.getcnt());

solusion2.setcnt(0);

arr.clear();

arr.addall(arr1);

}sc.close();}}

求逆序數 逆序數 歸併排序

求排列的逆序數 分治 一 題目描述 總時間限制 1000ms 記憶體限制 65536kb 描述 在internet上的搜尋引擎經常需要對資訊進行比較,比如可以通過某個人對一些事物的排名來估計他 或她 對各種不同資訊的興趣,從而實現個性化的服務。對於不同的排名結果可以用逆序來評價它們之間的差異。考慮1...

NYOJ 求逆序數

時間限制 2000 ms 記憶體限制 65535 kb 難度 5 描述在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。現在,給你乙個n個元素的序列,請你判斷出它的逆序數是多少。比如 1 3 2 的逆序數就是...

分治 求 逆序數

利用歸併,逆序數等於 左邊逆序數 右邊逆序數,加上 左邊 的每個數與右邊的每個數構成的逆序數。歸併過程 把 左邊和右邊按照從小到大排序 在 merge過程中發現a 右邊 a 左邊 說明 在此左邊p1位置的右側的數都能與 此時的p2位置的 a p2 構成逆序對。故 逐一對a j 進行判斷,累加即可得到...