題目:在陣列中的兩個數字如果前面乙個數字大於後面乙個數字 則這兩個數字組成乙個逆序對 輸入乙個陣列 求這個陣列中逆序對的個數
先把陣列分割成子陣列 先統計出子陣列內部的逆序對的數目 然後再統計出兩個相鄰子陣列之間的逆序對的數目 統計逆序對的過程中 還需要對陣列進行排序 這類似與歸併排序 演算法的時間複雜度為o(nlogn) 空間複雜度為o(n)
歸併排序
#includeusing namespace std;
void merge(int *a, int *temp, int start, int mid, int end)
while (a != mid + 1)
temp[d++] = a[a++];
while (b != end + 1)
temp[d++] = a[b++];
for (int i = start;i <= end;i++)
a[i] = temp[i];
}void sortg(int *a,int *temp ,int a,int b)
}int main()
; int n = 8;
int *t = new int[n];
memset(t, 0, sizeof(int)*n);
sortg(a, t, 0, n - 1);
for (int i = 0;i < n;i++)
cout << a[i] << ' ';
deletet;
return 0;
}
求逆序對數~~~
#includeusing namespace std;
int merge(int *a, int *temp, int start, int mid, int end)
else
temp[c--] = a[a--];
} while (a >= mid + 1)
temp[c--] = a[a--];
while (b >= start)
temp[c--] = a[b--];
for (int i = start;i <= end;i++)
a[i] = temp[i];
return t;
}int nimum(int *a, int *temp, int a, int b)
}int main()
; int n =6;
int *t = new int[n];
memset(t, 0, sizeof(int)*n);
int num=nimum(a, t, 0, n - 1);
for (int i = 0;i < n;i++)
cout << a[i] << ' ';
cout << endl<< num << endl;
deletet;
return 0;
}
分治遞迴逆序數 逆序數的分治演算法
給我們乙個序列,讓我們求其逆序數 如3 2 1 4 逆序數為 2 1 0 0 3 我們這樣定義乙個序列的逆序數 序列a1 a2 a3 a2 an 這個序列的逆序數c,等於a1,a2.的逆序數的和.即 c sum ci ci為滿足ai aj j i 的數的總的個數,即ci sum ai aj j i ...
求陣列的逆序數
題目 在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。現在,給你乙個n個元素的序列,請你判斷出它的逆序數是多少。比如 1 3 2 的逆序數就是1。方法1 o n 2 這個就不說了。方法2 借助歸併排序達到o...
求逆序數的分治演算法
給我們乙個序列,讓我們求其逆序數 如3 2 1 4 逆序數為 2 1 0 0 3 我們這樣定義乙個序列的逆序數 序列a1 a2 a3 a2 an 這個序列的逆序數c,等於a1,a2.的逆序數的和.即 c sum ci ci為滿足ai aj j i 的數的總的個數,即ci sum ai aj j i ...