劍指offer 35 陣列中的逆序對
阿新 • • 發佈:2018-12-30
1: 遍歷,只要前面的值大於後面的一個值,就加1;
2 : 氣泡排序,交換一次,就+1;
3: 歸併排序:
#include <iostream> #include <vector> using namespace std; class solution { public: //暴力,遍歷 int Inverspairs(vector<int> array) { int all = array.size(); if (all == 0 || all < 2){ return 0; } int number = 0; for (int i = 0; i < all; i++) { for (int j = i + 1; j < all; j++) { if (array[i] > array[j]) { number = number + 1;//前值大就+1 } } } return number; } //氣泡排序,交換即一個逆序對 int Inverspairs2(vector<int> element) { if (element.size() == 0 || element.size() < 2){ return 0; } return bubble_sort(element); } int bubble_sort(vector<int> array) { int all = array.size(); int count = 0; if (array.empty() != 0 || all <2){//all == 0 return 0; } for (int end = all -1; end > 0; end--)//end-- for (int i = 0 ; i < end ; i++ ){ if ( array[i] > array[i+1] ) {//前面大於後面的就交換 int temp = array[i]; array[i] = array[i+1]; array[i+1] = temp; count++; } } for(int i=0; i < array.size(); ++i) { cout << array[i] << endl; } return count; } //歸併逆序對 int InversPairs3(vector<int> elem) { if (elem.size() == 0) { return 0; } vector<int> temp(elem.size());//建立一個空陣列,有初始化 int count = InversPairs3Score(elem, 0, elem.size() - 1, temp);//呼叫統計 return count; } int MergeElem(vector<int> &elem, int start, int mid, int end, vector<int> &temp){ //傳引用,改變實參 int i = mid;//兩個陣列歸併 int j = end; int k = 0; int count = 0; while (i >= start && j > mid) { if (elem[i] > elem[j]) { temp[k++] = elem[i--];//大的排前邊 count += j - (mid+1) + 1;//大就統計 } else { temp[k++] = elem[j--]; } } cout << "count = " << count << endl; while (i >= start){ temp[k++] = elem[i--]; } while (j > mid) { temp[k++] = elem[j--]; } // temp 從大往小的順序 for (int i = 0; i < k; i++) { elem[end - i] = temp[i]; } //copy(elem.begin(), elem.end(), ostream_iterator<int>(cout," ")); for (int i = 0; i < elem.size(); i++) { cout << elem[i] << endl; } return count; } int InversPairs3Score(vector<int> &elem, int start, int end, vector<int> &temp) { //&傳引用,改變實參 int inversions = 0; if (start < end) { int mid = (start + end)/2; inversions += InversPairs3Score(elem, start, mid, temp);//左部分 inversions += InversPairs3Score(elem, mid+1, end, temp);//右部分 inversions += MergeElem(elem, start, mid, end, temp);//實參 } return inversions; } }; int main() { int a1[] = { 6, 5, 4 , 7, 2, 3, 4}; vector<int> vec(a1, a1+7); solution s; //cout << s.Inverspairs(vec) << endl; //cout << s.Inverspairs2(vec) << endl; cout << s.InversPairs3(vec) << endl; return 0; }