归并排序-逆序对数
/*
程序裝載自:http://www.cnblogs.com/XiongHarry/archive/2008/11/06/1327732.html
求逆序對數
設A[1..n]是一個包含N個非負整數的數組。如果在i〈 j的情況下,有A〉A[j],則(i,j)就稱為A中的一個逆序對。
例如,數組(3,1,4,5,2)的“逆序對”有<3,1>,<3,2><4,2><5,2>,共4個。
使用歸并排序可以用O(nlogn)的時間解決統計逆序對個數的問題?
定義:對于一個給定的數列,如果有i<j,且Ai>Aj,則稱(i,j)為一逆序對.?
要解決的問題是,給出一個數列,求出這個數列包含多少個逆序對
問題解析:
如何把逆序從問題中抽象出來成為解決問題的關鍵,這里的 逆序對數 實際就是插入排序中從后往前查時元素移動的次數,
也就是有序的序列逆序對數為0,
最簡單的算法就是 類似冒泡一樣從第一個位置開始向后比較,比較完在從第二個比較,這樣的時間復雜度為 n^2;
如果利用歸并的思想來編程序,時間復雜度為 nLog( n );
那么如何用到歸并排序的思想呢?如果用歸并,那么歸并 和 冒泡 相比又有那些優勢?
未完待續
程序裝載自:http://www.cnblogs.com/XiongHarry/archive/2008/11/06/1327732.html
求逆序對數
設A[1..n]是一個包含N個非負整數的數組。如果在i〈 j的情況下,有A〉A[j],則(i,j)就稱為A中的一個逆序對。
例如,數組(3,1,4,5,2)的“逆序對”有<3,1>,<3,2><4,2><5,2>,共4個。
使用歸并排序可以用O(nlogn)的時間解決統計逆序對個數的問題?
定義:對于一個給定的數列,如果有i<j,且Ai>Aj,則稱(i,j)為一逆序對.?
要解決的問題是,給出一個數列,求出這個數列包含多少個逆序對
問題解析:
如何把逆序從問題中抽象出來成為解決問題的關鍵,這里的 逆序對數 實際就是插入排序中從后往前查時元素移動的次數,
也就是有序的序列逆序對數為0,
最簡單的算法就是 類似冒泡一樣從第一個位置開始向后比較,比較完在從第二個比較,這樣的時間復雜度為 n^2;
如果利用歸并的思想來編程序,時間復雜度為 nLog( n );
那么如何用到歸并排序的思想呢?如果用歸并,那么歸并 和 冒泡 相比又有那些優勢?
*/
#include <iostream> #include <vector>using namespace std;//普通法查找逆序對 普通實現 O(n^2): template<class Iterator> int CountInversePair(Iterator first ,Iterator last) {Iterator it ,it2;int count = 0;for(it= first ;it!=last-1;++it){for(it2=it+1;it2!=last;++it2){if(*it>*it2)count ++;}}return count; }//歸并法查找逆序對int gCount = 0; template<class Iterator> int merge(Iterator begin, Iterator mid, Iterator end) {Iterator iL = begin;Iterator iR = mid;int count = distance(begin, end);vector<int> v(count);vector<int>::iterator it = v.begin();while(iL != mid && iR != end){if(*iL <= *iR){*it++ = *iL++;}else{gCount += distance(iL, mid);*it++ = *iR++;}}if(iL == mid) copy(iR, end, it);if(iR == end) copy(iL, mid, it);copy(v.begin(), v.end(), begin);return 0; }template<class Iterator> int mergeSort(Iterator begin, Iterator end) {int count, step;count = distance(begin, end);if(count <= 1){return 0;}step = count / 2;mergeSort(begin, begin + step);mergeSort(begin + step, end);merge(begin, begin + step, end);return 0; }int main() {int line[] = {3,1,4,5,2};//cout << CountInversePair(line,line+sizeof(line)/sizeof(int)) << endl;mergeSort(line,line+sizeof(line)/sizeof(int)) ;cout << gCount << endl;return 0; }未完待續
總結
- 上一篇: 数字图像处理-7频域滤波
- 下一篇: 统计学基本知识三