算法实验1《分治算法实验》

来源:互联网 发布:mac压缩包加密 编辑:程序博客网 时间:2024/05/22 10:54

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;}

原创粉丝点击