如果序列是亂序的,求乙個序列中和為x的數有幾對,可以修改歸併排序的合併過程即可,因為合併的過程中比較了任意的兩個數。這種思想當然用來求差為x,乘積為x,商為x等類似問題依然有效。時間複雜度為o(nlgn)。
當然也可以先對序列排序(任何排序演算法也可以),再從序列兩頭向中間掃瞄,也可解決問題,詳細請見
下面給出我利用歸併排序求解的**:
//歸併排序應用1:求陣列中兩個數之和為x的有幾對
//直接修改merge過程即可
int merge(int *a, int low, int mid, int high, const int x)
while(i<=mid)
merge[k++] = a[i++];
while(j<=high)
merge[k++] = a[j++];
k=0;
while(low<=high)
a[low++] = merge[k++];
delete merge;
return count;
}int countsumx(int *a, int low, int high, const int x)
return count;
}int countsumx(const int *a, int n, const int x)
利用歸併排序求解逆序數及其時間複雜度分析
part 1 問題描述 在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。現在給定乙個序列,其中元素皆為整數 當然,這裡只是為了方便,實際上也可以是其他型別的資料 元素個數未知,要求給出其逆序數。part 2...
利用歸併排序求陣列中的逆序對
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數 如陣列,逆序對總共有5對,這道題可以採用歸併排序的思想來處理 先把陣列分成兩個子串行,統計左半部分逆序對的數目和右半部分逆序對的數目,然後將兩個子串行排序,避免重複 然後再統計...
關於歸併排序及快速求序列逆序對數的學習
1.關於排序 這算是最簡單的演算法了吧,簡單樸素的演算法如氣泡排序和選擇排序複雜度均為o n 2 顯然無法滿足這個物欲橫流 飛速發展的時代的要求,於是我們需要o nlogn 的排序 那麼我們想 如果有兩個有序序列,把他們合併成乙個有序序列的複雜度是多少?void merge int l,int mi...