合併排序遞迴演算法 逆序問題 眾數問題(C )

2021-08-31 18:25:33 字數 1771 閱讀 1244

用遞迴的合併排序對如下資料進行排序(45, 23, 65, 57, 38, 2, 96, 87, 14, 70 )

合併排序演算法是用分治策略實現對n個元素進行排序的演算法;

基本思想:

將待排序陣列分為成分大小大致相同的2個子集和;

分別對兩個子集和進行排序;

合併兩個排序後的子集和。

**實現:(時間複雜度:o(nlongn))

#includeusing namespace std;

void merge(int a,int start,int end,int b)//合併

return;

}else if(0==end-start)

return;

else

}int main()

; const int length = 10;

int b[length];

cout << "排序前:" << endl;

for(int i = 0;i < length;++i)

cout << a[i] << " ";

cout << endl;

cout << "排序後:" << endl;

mergesort(a,0,length-1,b);

for(int i = 0;i < length;++i)

cout << a[i] << " ";

cout << endl;

return 0;

}

排列a中若存在iaj,則稱是該排列的乙個逆序,乙個排列含有逆序的個數稱為該排列的逆序數。例如排列2 6 3 4 5 1中含有8個逆序<2, 1>、<6, 3>、<6, 4>、<6, 5>、<6, 1>、❤️, 1>、<4, 1>、<5, 1>。利用分治思想設計演算法,計算給定排列的逆序數。

在合併排序的基礎上加計數器計算逆序數。

#includeusing namespace std;

int count=1;//計數器

void merge(int a,int start,int end,int b)

return;

}else if(0==end-start)

return;

else

}int main()

; const int length = 6;

int b[length];

cout << "排序前:" << endl;

for(int i = 0;i < length;++i)

cout << a[i] << " ";

cout << endl;

cout << "排序後:" << endl;

mergesort(a,0,length-1,b);

for(int i = 0;i < length;++i)

cout << a[i] << " ";

cout<設a 是n個數構成的陣列,其中出現次數最多的數稱為眾數,設計乙個演算法求a的眾數。

首先對陣列進行排序,及在合併排序的基礎上求眾數。

對陣列進行遍歷,求出數量最多的那個數。

//新增上合併排序的**段

void most(int a,int length)

if (maxcount < count)

++j;

i = j;

} cout <<"眾數:" <}

遞迴實現合併排序

subject 計算機演算法設計與分析 title 2.7.1 遞迴實現合併排序 coder hao class 計科0906 num 0304090614 date sept 25th,2011 includeusing namespace std 用於合併的函式 template void me...

歸併排序(合併排序) 遞迴法

參考了一些大佬的 再自己總結了一下。原理基本不變。歸併排序 合併排序 是一種分治演算法。這個演算法不斷地將乙個陣列分為兩部分,分別對左子陣列和右子陣列排序,然後將兩個陣列合併為新的有序陣列。穩定 是 時間複雜度 最優 o nlog n 最差 o nlog n 平均 o nlog n include ...

排序(2)歸併排序(遞迴 合併排序)

用到遞迴 合併,所以叫歸併。public static int data 遞迴 param temp 臨時陣列 param sindex 開始索引 param eindex 結束索引 private static void recursion int temp,int sindex,int eind...