1. 程式人生 > >演算法實驗1《分治演算法實驗》

演算法實驗1《分治演算法實驗》

1.編寫一個簡單的程式,實現歸併排序。

#include<iostream>
using namespace std;

void merge(int list[],int left,int m,int right)
{
	int b[10];
	int i=left,j=m+1,k=left;
	while(i<=m && j<=right)
	{
		if(list[i]<list[j])
			b[k++]=list[i++];
		else b[k++]=list[j++];
	}
	if(i>m)
		for(int q=j;q<=
right;q++)b[k++]=list[q]; else for (int q=i;q<=m;q++)b[k++]=list[q]; for(int ii=left;ii<=right;ii++) { list[ii]=b[ii]; } } void mergeSort(int list[],int left,int right) { if(left<right) { int i=(left+right)/2; mergeSort(list,left,i); mergeSort(list,i+1,right); merge(list,left,
i,right); } } int main() { int list[10]; for(int i=0;i<10;i++) { cin>>list[i]; } mergeSort(list,0,9); for(int i=0;i<10;i++) { cout<<list[i]<<" "; } system("pause>nul"); return 0; }

2.編寫一段程式,實現快速排序。

#include<iostream>
using namespace std;

int par(int a[],
int p,int r) { int i=p,j=r+1; int x=a[p]; while(1) { while(a[++i]<x && i<r); while(a[--j]>x); if(i>=j)break; int te=a[i]; a[i]=a[j]; a[j]=te; } a[p]=a[j]; a[j]=x; return j; } void qSort(int list[],int p,int r) { if(p<r) { int q=par(list,p,r); qSort(list,p,q-1); qSort(list,q+1,r); } } int main() { int list[10]; for(int i=0;i<10;i++) { cin>>list[i]; } qSort(list,0,9); for(int i=0;i<10;i++) { cout<<list[i]<<" "; } system("pause>nul"); return 0; }

3.編寫程式實現迴圈賽日程表。設有n=2k個運動員要進行網球迴圈賽。現要設計一個滿足以下要求的比賽日程表:(1)每個選手必須與其它n-1個選手各賽一次(2)每個選手一天只能賽一場(3)迴圈賽進行n-1天

#include<iostream>
#include<iomanip>
using namespace std;

int main()
{
	int k;
	while (cin >> k)
	{
		int n = 1;
		for (int i = 1; i <= k; i++)n *= 2;
		int **p;
		p = new int*[n + 1];
		for (int i = 0; i <= n; i++)
		{
			p[i] = new int[n + 1];
		}
		for (int i = 1; i <= n; i++)p[1][i] = i;
		int  m = 1;
		for (int s = 1; s <= k; s++)
		{
			n /= 2;
			for (int t = 1; t <= n; t++)
			for (int i = m + 1; i <= 2 * m; i++)
			for (int j = m + 1; j <= 2 * m; j++)
			{
				int temp = j + (t - 1)*m * 2;
				p[i][temp] = p[i - m][temp - m];
				p[i][temp - m] = p[i - m][temp];
			}
			m *= 2;
		}
		n = 1;
		for (int i = 1; i <= k; i++)n *= 2;
		for (int i = 1; i <= n; i++)
		{
			cout << endl << setw(2) << p[i][1] << "   ";
			for (int j = 2; j <= n; j++)
			{
				cout << setw(4) << p[i][j] << " ";
			}
		}
	}
	system("pause>nul");
	return 0;
}

相關推薦

南郵演算法分析與設計實驗1 分治策略

分治策略 實驗目的: 理解分治法的演算法思想,閱讀實現書上已有的部分程式程式碼並完善程式,加深對分治法的演算法原理及實現過程的理解。 實驗內容: 用分治法實現一組無序序列的兩路合併排序和快速排序。要求清楚合併排序及快速排序的基本原理,程式設計實現分別用這兩種方法將輸入的

第2章 感知器分類演算法 2-1 分類演算法的總體描述

機器學習的本質是模擬人的神經元對資訊的處理方法。根據神經學的研究,神經元可以看做是一種簡單的帶有二進位制輸出功能的邏輯電路門。多種電訊號能夠從神經元的交叉部分,這種電訊號能夠從交叉部分輸入到我們的神經元之中。那麼這些從這個交叉部分輸進來的電訊號,那麼會進入到神經元的細胞核。那麼細胞核就會將樹突傳入來的這個

【C++實現】五大常用演算法之一:分治演算法(例項:漢諾塔)

求解思想:大而化小 1、問題拆分成子問題 2、對子問題求解 在漢諾塔遊戲中,有三個分別命名為A、B、C得塔座,幾個大小各不相同,從小到大一次編號得圓盤,每個原盤中間有一個小孔。最初,所有得圓盤都在A塔座上,其中最大得圓盤在最下面,然後是第二大,以此類推. 先上程式

五大常用演算法之一:分治演算法(轉)

分治演算法 一、基本概念    在電腦科學中,分治法是一種很重要的演算法。字面上的解釋是“分而治之”,就是把一個複雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題……直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。這個技巧是很多高效演算法的基礎,如排序演算法(快速排序,

Web安全:實驗1-網路掃描實驗

警示:實驗報告如有雷同,雷同各方當次實驗成績均以0分計;在規定時間內未上交實驗報告的,不得以其他方式補交,當次成績按0分計;實驗報告檔案以PDF格式提交。 院系 資料科學與計算機學院 班級 15級4班 學號 15331145 姓名 李果

五大常用演算法之一:分治演算法(轉載)

轉載自:http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741370.html 一、基本概念    在電腦科學中,分治法是一種很重要的演算法。字面上的解釋是“分而治之”,就是把一個複雜的問題分成兩個或更多的相

演算法淺談——分治演算法與歸併、快速排序(附程式碼和動圖演示)

在之前的文章當中,我們通過海盜分金幣問題詳細講解了遞迴方法。 我們可以認為在遞迴的過程當中,我們通過函式自己呼叫自己,將大問題轉化成了小問題,因此簡化了編碼以及建模。今天這篇文章呢,就正式和大家聊一聊將大問題簡化成小問題的分治演算法的經典使用場景——排序。 排序演算法 排序演算法有很多,很多博文都有總結

演算法實驗1分治演算法實驗

1.編寫一個簡單的程式,實現歸併排序。 #include<iostream> using namespace std; void merge(int list[],int left,

《資料結構與演算法A》實驗1:按資料元素升序建立單鏈表

** 實驗題目 ** 對輸入的正整數序列建立有序單鏈表。在建立單鏈表的過程中,連結串列中的資料元素按升序排列。當輸入的資料元素在單鏈表中已經存在時,不進行插入操作。 請使用面向物件形式定義結點類和連結串列類,參考程式碼如下。 class Node { int

【NOJ1002】【演算法實驗一】【分治演算法】歸併排序

1002.歸併排序 時限:1000ms 記憶體限制:10000K  總時限:3000ms 描述 給定一個數列,用歸併排序演算法把它排成升序。 輸入 第一行是一個整數n(n不大於10000),表示要排序的數的個數; 下面一行是用空格隔開的n個整數。 輸出

實驗六:排序演算法應用 1.錄入學生基本資訊 2、直接插入排序 3、氣泡排序 4、快速排序 5、簡單選擇排序 6、堆排序

/*實驗六:排序演算法應用 內容: 給出n個學生的考試成績表,每條記錄由學號、姓名和分數和名次組成,設計演算法完成下列操作: (1)設計一個顯示對學生資訊操作的選單函式如下所示: *************************1、錄入學生基本資訊2、直接插入排序3、氣泡

演算法第二章實踐上機實驗報告

題目:二分法查詢 問題描述:用二分法查詢x,找到時輸出x的下標和比較次數;找不到時輸出-1和比較次數。 演算法語言描述: 輸入陣列和要查詢的數x   演算法描述:將一個數組分為兩半,設定一箇中間量a[mid]與要查詢的數x比較,設定一個變量表示比較次數cnt,每次比較後

演算法第三章上機實驗

演算法第三章上機實驗 數字三角形 給定一個由 n行數字組成的數字三角形如下圖所示。試設計一個演算法,計算出從三角形 的頂至底的一條路徑(每一步可沿左斜線向下或右斜線向下),使該路徑經過的數字總和最大。 #include <iostream> using namespace std; in

演算法第三章上機實驗報告

1.實踐題目 7-2 最大子段和 2.問題描述 給定n個整數(可能為負數)組成的序列a[1],a[2],a[3],…,a[n],求該序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。當所給的整數均為負數時,定義子段和為0。 要求演算法的時間複雜度為O(n)。 3.演算法描述 首

演算法第3章上機實驗報告

演算法第3章上機實踐報告 實踐報告任選一題進行分析。內容包括: 1.實踐題目 7-1數字三角形 2.問題描述 給定一個由 n行數字組成的數字三角形如下圖所示。試設計一個演算法,計算出從三角形 的頂至底的一條路徑(每一步可沿左斜線向下或右斜線向下),使該路徑經過的數字總和最大。 3.演算法描述 我

演算法第四章上機實驗報告

題目:刪數問題 問題描述:輸入一個正整數a和一個正整數k(k≤n ),在n位正整數a中去掉其中任意k個數字後,剩下的數字按原次序排列組成一個新 的正整數。 演算法描述:從前往後進行比較,刪掉升序的最後那個數,若一直保持升序,則刪掉最後一位數,重複k次,刪掉k個數 時間複雜度:該演算法主要進行了

演算法第五章上機實驗報告

工作分配問題: 問題描述:已知n的值與每個工作分配給其中一人的費用,n件工作分配給n個人,一二維陣列記錄工作i分配給第j個人所需的費用為c[i][j] 。 設計一個演算法,對於給定的工作費用,為每一個人都分配1 件不同的工作,並使總費用達到最小(需要注意的是每個人只能被分配到一項工作) 演算法描述: 解

實驗: 古典加密演算法 caesar cipher

<2011_0123> caesar cipher 參考資料: http://www.codeproject.com/KB/recipes/Encryption_Techniques.aspx?display=Print Classical Encrypti

實驗二 分類演算法實驗

一.實驗目的 1.鞏固4種基本的分類演算法的演算法思想:樸素貝葉斯演算法,決策樹演算法,人工神經網路,支援向量機演算法; 2.能夠使用現有的分類器演算法程式碼進行分類操作 3.學習如何調節演算法的引數以提高分類效能; 二、實驗的硬體、軟體平臺 硬體

作業系統實驗--頁面替換演算法

作業系統實驗4–頁面替換演算法 基本資料結構 變數名 意義 pageNum 總頁面數 rsLen 引用串長度 frameNum 實體記憶體長度 rs[] 儲存引用串的陣列 frameAr