分治演算法 求陣列逆序數

2021-07-02 14:21:06 字數 1484 閱讀 2770

題目:在陣列中的兩個數字如果前面乙個數字大於後面乙個數字 則這兩個數字組成乙個逆序對 輸入乙個陣列 求這個陣列中逆序對的個數

先把陣列分割成子陣列 先統計出子陣列內部的逆序對的數目 然後再統計出兩個相鄰子陣列之間的逆序對的數目 統計逆序對的過程中 還需要對陣列進行排序 這類似與歸併排序 演算法的時間複雜度為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 ...