1、用分治法設計與實現歸併排序演算法。
2、給定含有 n 個元素的多重集合 s,每個元素在 s 中出現的次數稱為該元素的重數。多重集合 s 中重數最大的元素稱為眾數。例如多重集合 s=,其中眾數是 2,其重數為 3。用分治法設計並實現在多重集合中找眾數及其重數的演算法,要求演算法的時間複雜性在壞情況下不超過 o(nlogn)。
//分治法實現歸併排序
#include
#include
using namespace std;
#define size 10
typedef struct
int num;
int freq;
}elem;
void merge(int array,int first,int mid,int last)//歸併排序
int new_arr[size],i,j,k=first;//建立臨時陣列new_arr和ijk的初始化
memset(new_arr,0,size);//初始化new_arr陣列
for (i = first,j = mid + 1;(i <= mid)&&(j <= last);)//將原陣列的前半段的第乙個元素和後半段的第乙個元素比較,並放入臨時陣列中直到某半段陣列全部排序完
if(array[i] <= array[j])
new_arr[k++] = array[i++];
else
new_arr[k++] = array[j++];
if(i <= mid)//如果後半段的陣列先排序完,則將前半段的剩下的所有元素按順序接到原陣列的後邊
for(;i <= mid;i++)
new_arr[k++] = array[i];
if(j <= last)//如果前半段的陣列先排序完,則將後半段的剩下的所有元素按順序接到原陣列的後邊
for(;j <= last;j++)
new_arr[k++] = array[j];
for(int p = first;p <=last;p++) //將排好順序的元素放回原陣列
array[p]=new_arr[p];
void merge_sort(int array,int first,int last)//歸併排序
int mid = 0;//初始化mid
if(firstmid = (first + last)/2;//mid 為陣列長度的一半
merge_sort(array, first,mid);//分治法:將陣列分為兩段,先對前半段進行歸併排序
merge_sort(array, mid+1,last);//對後半段進行歸併排序
merge(array,first,mid,last);//再將整體進行一次歸併排序
void merge(elem array,int first,int mid,int last)//歸併排序
elem new_arr[4];
int i,j,k=first;//建立臨時陣列new_arr和ijk的初始化
for (i = first,j = mid + 1;(i <= mid)&&(j <= last);)//將原陣列的前半段的第乙個元素和後半段的第乙個元素比較,並放入臨時陣列中直到某半段陣列全部排序完
if(array[i].freq <= array[j].freq)
new_arr[k++] = array[i++];
else
new_arr[k++] = array[j++];
if(i <= mid)//如果後半段的陣列先排序完,則將前半段的剩下的所有元素按順序接到原陣列的後邊
for(;i <= mid;i++)
new_arr[k++] = array[i];
if(j <= last)//如果前半段的陣列先排序完,則將後半段的剩下的所有元素按順序接到原陣列的後邊
for(;j <= last;j++)
new_arr[k++] = array[j];
for(int p = first;p <=last;p++) //將排好順序的元素放回原陣列
array[p]=new_arr[p];
void merge_sort(elem array,int first,int last)//歸併排序
int mid = 0;//初始化mid
if(firstmid = (first + last)/2;//mid 為陣列長度的一半
merge_sort(array, first,mid);//分治法:將陣列分為兩段,先對前半段進行歸併排序
merge_sort(array, mid+1,last);//對後半段進行歸併排序
merge(array,first,mid,last);//再將整體進行一次歸併排序
int main()
int arr[size]=;
merge_sort(arr,0,9);
for(int i = 0;i < size;i++)
cout << arr[i] << " ";
cout << endl;
cout<<"第二個實驗:請輸入一組數,返回眾數及頻度";
int array[10]=;
merge_sort(array,0,9);
elem anoarr[4];
for(int i = 0;i<4;i++)
anoarr[i].num = 0;
anoarr[i].freq = 0;
int j = 0;
coutif(i == 0)
anoarr[j].freq++;
anoarr[j].num = array[i];
}else {
if(array[i-1]!=array[i])
j++;
anoarr[j].freq++;
anoarr[j].num = array[i];
else
anoarr[j].freq++;
merge_sort(anoarr,0,3);
for(int i = 0;i<4;i++)
cout<<"anoarr[" 該部落格結合leetcode原題介紹了可以使用 分治 思想解決的常見題目。leetcode 50 pow x,n 1 暴力解法 多少次冪,就乘上多少次x。但是提交的話會超時。時間複雜度 o n 空間複雜度 o 1 class solution object defmypow self,x,n typ... 遞迴思想 遞迴就是有去 遞去 有回 歸來 有去 是指 遞迴問題必須可以分解為若干個規模較小,與原問題形式相同的子問題,這些子問題可以用相同的解題思路來解決,就像鑰匙可以開啟所有門上的鎖一樣 有回 是指 這些問題的演化過程是乙個從大到小,由近及遠的過程,並且會有乙個明確的終點 臨界點 一旦到達了這個臨... 中心擴散法,顧名思義就是以某乙個位置為中心,向周圍擴散,直到滿足條件或到達邊界。題目描述 給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 解題思路 遍...資料結構演算法 遞迴 分治
資料結構與演算法(3) 遞迴與分治思想
資料結構與演算法 中心擴散法