欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
算法設計與分析程序
[打印本頁]
作者:
1371797138
時間:
2019-12-11 10:32
標題:
算法設計與分析程序
算法設計與分析部分程序代碼
第三題:假設A[1……n]是一個有n個不同數的數組。若i<j且A[ i]>A[j],則對偶(i,j)稱為A的一個逆序對。給出一個確定在n個元素的任何排列中逆序對數量的算法,要求時間復雜度為O(nlog2n)
算法分析:
因為題目中要求時間復雜度為O(nlog2n),所以不用暴力求解法和插入排序法?紤]用歸并排序法,只需要在歸并排序的基礎上添加一個變量counter用來逆序計數即可。具體實現見如下代碼。時間復雜度為O(nlog2n)
#include<iostream>
using namespace std;
int Merge(int* a, int al, int ah, int* b, int bl, int bh, int* c)
{
int i, j, k;
int counter = 0;
i = al;
j = bl;
k = 0;
while (i <= ah && j <= bh) {
if (a[i] <= b[j]) {
c[k] = a[i];
i++;
}
else {
c[k] = b[j];
j++;
counter += ah - i + 1;
}
k++;
}
while (i <= ah) {
c[k] = a[i];
k++;
i++;
}
while (j <= bh) {
c[k] = b[j];
k++;
j++;
}
return counter;
}
int MergeSort1(int* A, int* temp, int low, int high)
{
int mid, i;
if (low >= high) return 0;
mid = (low + high) / 2;
int ans1 = MergeSort1(A, temp, low, mid);
int ans2 = MergeSort1(A, temp, mid + 1, high);
int ans3 = Merge(A, low, mid, A, mid + 1, high, temp);
for (i = 0; i <= high - low; i++) {
A[low + i] = temp[i];
}
return ans1 + ans2 + ans3;
}
int MSort(int* A, int n)
{
int* temp = new int[n];
int ans = MergeSort1(A, temp, 0, n - 1);
free((char*)temp);
return ans;
}
int main()
{
int n;
int number;
cout << "請輸入數組的大。" << endl;
cin >> n;
while (n <= 0) {
cout << "輸入的數據有誤,請重新輸入:" << endl;
cin >> n;
}
int* A = new int[n];
cout << "請輸入數組A中的各個元素:" << endl;
for (int i = 0; i < n; i++) {
cin >> A[i];
}
number = MSort(A, n);
cout << "A中逆序對的數量為:" << number;
return 0;
}
復制代碼
51hei.png
(63.88 KB, 下載次數: 67)
下載附件
2019-12-11 16:03 上傳
全部資料51hei下載地址:
第四次作業.docx
(256.54 KB, 下載次數: 9)
2019-12-11 10:32 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1