- 说明:这是武汉理工大学计算机学院【算法设计与分析】课程的第一次实验第一题:分治法与中位数问题
- >>点击查看武汉理工大学计算机专业课程资料汇总
- >>点击查看WUTer计算机专业实验汇总
- 谨记:纸上得来终觉浅,绝知此事要躬行。
一、问题描述
输入任意一串数字,输出这个数字串的中位数(如果数字个数为偶数,则输出中间lian两个数的平均值)。
二、实验代码
完整VS 2017项目:https://github.com/cxh1231/Junior-Algorithm-MedianProblem
#include<iostream>
using namespace std;
int Partition(int r[], int first, int end); //划分
void QuickSort(int r[], int first, int end); //快速排序
double GetMid(int r[], int n);
//划分
int Partition(int r[], int first, int end) //划分
{
int i = first, j = end; //初始化待划分区间
while (i < j)
{
while (i < j && r[i] <= r[j]) j--; //右侧扫描
if (i < j) {
int temp = r[i]; r[i] = r[j]; r[j] = temp; //将较小记录交换到前面
i++;
}
while (i < j && r[i] <= r[j]) i++; //左侧扫描
if (i < j) {
int temp = r[i]; r[i] = r[j]; r[j] = temp; //将较大记录交换到后面
j--;
}
}
return i; // 返回轴值记录的位置
}
//快速排序
void QuickSort(int r[], int first, int end) { //快速排序
int pivot;
if (first < end) {
pivot = Partition(r, first, end); //划分,pivot是轴值在序列中的位置
QuickSort(r, first, pivot - 1); //求解子问题1,对左侧子序列进行快速排序
QuickSort(r, pivot + 1, end); //求解子问题2,对右侧子序列进行快速排序
}
}
double GetMid(int r[], int n)
{
//如果元素个数为偶数个,则为中间两个数 平均数
if (n % 2 == 0)
return (r[n / 2] + r[n / 2 + 1]) / 2.0;
//为奇数,则中间数
else
return (double)r[n / 2 + 1];
}
int main() {
int r[100];
int n;
float result;
cout << "请输入序列元素个数:" ;
cin >> n;
cout << "请输入序列:" ;
for (int i = 1; i <= n; i++)
cin >> r[i];
QuickSort(r, 1, n);
cout << "求得此序列的中位数为:" << GetMid(r, n) << endl;
return 0;
}