1、快速排序
思想:把所有大于数组中第一个数的全都放在这个数的右边,把所有小于数组第一个数的数放在这个数的左边,然后再分别对这个数所在位置的左边数组和右边数组进行排序。
#include <iostream>
using namespace std;
typedef int Type;
void Swap(int& a, int& b)
{
int temp = a; a = b; b = temp;
}
int Partition(Type a[], int p, int r)
{
int i = p, j = r + 1;
Type x = a[p];
// 将< x的元素交换到左边区域
// 将> x的元素交换到右边区域
while (true) {
while (a[++i] < x); //先做 i=i+1; 再做 a[i]<x; 真的话 继续,直到 i = i + 1 后,a[i]<=x
while (a[--j] > x);
if (i >= j) break;
Swap(a[i], a[j]);
}
a[p] = a[j];
a[j] = x;
cout<<" ";
for(int i=0;i<=6;i++)
cout<<a[i]<<" ";
cout<<endl;
return j;
}
void QuickSort(Type a[], int p, int r)
{
if (p < r) {
int q = Partition(a, p, r);
QuickSort(a, p, q - 1); //对左半段排序
QuickSort(a, q + 1, r); //对右半段排序
}
}
int main(void)
{
Type a[] = { 11,9,3,61,5,1598,7 };
cout << "排序前的原始数据";
for (int i = 0; i <= 6; i++)
cout << a[i] << " ";
cout << endl;
QuickSort(a, 0, 6);
cout << "排好序后有序数据";
for (int i = 0; i <= 6; i++)
cout << a[i] << " ";
cout << endl;
return 0;
}
2、循环赛程问题
有N个运动员进行单循环赛,即每个运动员要和所有其他运动员进行一次比赛。将运动员从1到N编号。只考虑次幂的情况,即N=2
试用分治法为这N个运动员安排比赛日程。
(1)每个运动员要和其他N-1个运动员进行一次比赛
(2)要求每个运动员每天只进行一场比赛。
(3)且整个赛程在N -1天内结束。
源码:
#include <iostream>
using namespace std;
typedef int Type;
int table[50][50];
void fillTable(int x, int y, int step);
int main()
{
int n;
ls:
cout << "请输入比赛的选手数量" << endl;
cin >> n;
cout << "日期 ";
for (int i = 1; i < n; i++)
cout << i << " ";
cout << endl;
cout << "选手 ";
for (int i = 1; i < n; i++)
cout << "-----";
cout << endl;
for (int i = 1; i <= n; i++)
table[i][1] = i;
fillTable(1, 1, n);
for (int i = 1; i <= n; i++) {
cout << " " << table[i][1] << " |";
for (int j = 2; j <= n; j++)
cout << " " << table[i][j] << " ";
cout << endl;
}
goto ls;
system("pause");
return 0;
}
void fillTable(int x, int y, int step)
{
if (step == 1)
return;
step /= 2;
fillTable(x, y, step);
fillTable(x + step, y, step);
for (int i = 0; i < step; i++)
for (int j = 0; j < step; j++) {
table[x + step + i][y + step + j] = table[x + i][y + j];
table[x + i][y + step + j] = table[x + step + i][y + j];
}
}