【劍指offer】【九度oj】數組中的逆序對

來源:互聯網
上載者:User

時間限制:1 秒

記憶體限制:32 兆

題目描述:

在數組中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個數組中的逆序對的總數。
輸入:
每個測試案例包括兩行:第一行包含一個整數n,表示數組中的元素個數。其中1 <= n <= 10^5。第二行包含n個整數,每個數組均為int類型。
輸出:
對應每個測試案例,輸出一個整數,表示數組中的逆序對的總數。
範例輸入:
47 5 6 4

範例輸出:
5

分析:我們首先想到的是一種暴力演算法,讓數組中的每一個元素都與數組的其他所有元素進行比較,時間複雜度為o(n^2),顯然不滿足題目要求,那麼我們需要尋找更高效的演算法。歸併排序的時間複雜度為o(nlogn),利用它的思想可以求得逆序對總數。歸併排序是相鄰兩個有序塊進行比較,然後合并,形成一個新的有序塊。在兩個有序塊left和right塊合為一個有序塊的過程中,元素的位置會發生變化,通過記錄right塊的每個元素的位置變化,來得到合并後塊的逆序對的數量。這樣,我們就在歸併排序的過程中,統計出了逆序對的數量。

#include <stdio.h>#include <stdlib.h>#define MAX 0x7fffffffint a[100010];long long count;void merge( int p, int q, int r ){int n1,n2,*left,*right,i,j,k;n1 = q - p + 1;n2 = r - q;left = (int*)malloc((n1+1)*sizeof(int));right = (int*)malloc((n2+1)*sizeof(int));for( i=0; i<n1; i++ )left[i] = a[p+i];for( i=0; i<n2; i++ )right[i] = a[q+i+1];left[n1] = MAX;right[n2] = MAX;for( i=0,j=0,k=p; k<=r; k++)if(left[i]<=right[j]){a[k] = left[i];i++;}else{count = count + q + 1 + j - k;  //逆序對計數,在歸併排序演算法的基礎上僅僅增加了這條語句a[k] = right[j];j++;}free(left);free(right);}void merge_sort( int p, int r ){int q;if( p<r ){q = ( p + r ) / 2;merge_sort( p, q );merge_sort( q+1, r );merge( p, q, r);}}int main(){int i,n;while(scanf("%d",&n)!=-1){count = 0;for( i=0; i<n; i++ )scanf("%d",&a[i]);merge_sort( 0, n-1 );printf("%lld\n",count);}return 0;}

上述歸併排序的寫法參考的是《演算法導論》P17。

注意:全域變數count不能聲明為int型,必須為long long型。因為題目中說數組最大為10^5,那麼最大逆序對為(10^5-1)*10^5/2,這個數大約在50億左右,超過了int型的表示範圍。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.