資料結構與演算法 分治法

2021-08-14 18:47:49 字數 3076 閱讀 6822

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...

資料結構與演算法(3) 遞迴與分治思想

遞迴思想 遞迴就是有去 遞去 有回 歸來 有去 是指 遞迴問題必須可以分解為若干個規模較小,與原問題形式相同的子問題,這些子問題可以用相同的解題思路來解決,就像鑰匙可以開啟所有門上的鎖一樣 有回 是指 這些問題的演化過程是乙個從大到小,由近及遠的過程,並且會有乙個明確的終點 臨界點 一旦到達了這個臨...

資料結構與演算法 中心擴散法

中心擴散法,顧名思義就是以某乙個位置為中心,向周圍擴散,直到滿足條件或到達邊界。題目描述 給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 解題思路 遍...