演算法設計與分析 實驗1

2021-08-15 02:49:26 字數 3418 閱讀 9783

一、

實驗目的和要求

理解分治法的演算法思想,閱讀實現書上已有的部分程式**並完善程式,加深對分治法的演算法原理及實現過程的理解。

二、實驗環境

(實驗裝置

)

code::blocks13.12

三、

實驗原理及內容

一、用分治法實現一組無序序列的兩路合併排序和快速排序。要求清楚合併排序及快速排 序的基本原理,程式設計實現分別用這兩種方法將輸入的一組無序序列排序為有序序列後輸出。

源程式:

#include

#include

#include

#include

using

namespace

std;

const

intinf = 2147483647;

class

sortablelist

~sortablelist()

void

input();

void

output();

void

mergesort();

void

quicksort();

void

select(

intk)

private:

int*l;

intn;            

//陣列中已有元素個數

intmaxsize;

void

mergesort(

intleft

, int

right);

void

merge(

intleft

, int

mid,

intright);

void

insertsort(

intleft

, int

right);

void

swap(

inti

, int

j);  

//交換下標為i和

j的陣列元素

void

quicksort(

intleft

, int

right);

intpartition(

intleft

, int

right

);// 

分化操作

intrpartition(

intleft

, int

right);

intselect(

intk

, int

left

, int

right

, intr);

};

void

sortablelist

::insertsort(

intleft

, int

right)

l[i]= temp; }

} void

sortablelist

::input()

l[n]= inf; }

void

sortablelist

::output()

cout

<<

endl; }

void

sortablelist

::swap(

inti

, intj)

//兩路合併排序

void

sortablelist

::mergesort()

void

sortablelist

::mergesort(

intleft

, int

right)

} void

sortablelist

::merge(

intleft

, int

mid,

intright)

//快速排序

intsortablelist

::rpartition(

intleft

, int

right)

intsortablelist

::partition(

intleft

, int

right)

while(i

swap(

left

, j);

returnj;

} void

sortablelist

::quicksort(

intleft

, int

right)

} void

sortablelist

::quicksort()

intsortablelist

::select(

intk

, int

left

, int

right

, intr)

for(

inti = 1; i <= n/

r; i++)

intj = select((

int)ceil((

double

)n /

r/ 2),

left

, left

+ n /

r- 1,

r);

//求二次中間值,其下標為j

swap(

left

, j); 

//二次中間值為樞紐元,並換至

left處

j= partition(

left

, right

); 

//對錶(子表)進行分劃操作 if

(k= j -

left

+ 1) 

//返回第

k小元素下標

returnj;

elseif(

kleft

+ 1) 

//在左子表求第

k小元素

return

select(k,

left

, j - 1, r);

else

return

select(

k- (j -

left

+ 1), j + 1,

right, r

); 

//在右子表求第

k-(j-left+1)

小元素 }

intmain()

演算法設計與分析 實驗3

一 實驗目的和要求 學習程式設計實現深度優先搜尋狀態空間樹求解實際問題的方法,著重體會求解第乙個可行解和求解所有可行解之間的差別。加深理解回溯法通過搜尋狀態空間樹 同時用約束函式剪去不含答案狀態子樹的演算法思想,會用蒙特卡羅方法估計演算法實際生成的狀態空間樹的結點數。二 實驗環境 實驗裝置 vsia...

演算法分析與設計實驗十二

問題 給定無向連通圖g和m種顏色,用這些顏色給圖的頂點著色,每個頂點一種顏色。如果要求g的每條邊的兩個頂點著不同顏色。給出所有可能的著色方案 如果不存在,則回答 no 解析 四色猜想 四色問題是m圖著色問題的乙個特例,根據四色原理,證明平面或球面上的任何地圖的所有區域都至多可用四種 顏色來著色,並使...

演算法設計與分析 1

實驗題目 生成兩個隨機的圖,乙個有向圖乙個無向圖。有向圖兩千條邊左右,無向圖一千條邊左右,邊的數量是大概的。100個頂點。要求能算出每個頂點的度。要求每次圖是隨機生成的,並且有良好的結構。今後的實驗都基於這個圖結構。任意語言和環境。建議鍊錶描述。然後基於這個圖實現乙個廣度優先搜尋。參考文獻 c 中的...