C++9-1-数组类模板:中位数

请实现一个模板函数,求出数组中的中位数,数组可能为整数数组,也可能为浮点数数组。数组的中位数定义为数组按非递减顺序排序后的第 ⌊ n/2 ⌋ + 1 个数,其中n为数组元素个数。每个测试用例都会测试一个整数数组和一个浮点数数组。

输入描述

每个测例共 3 行,第一行输入 m 和 n ( m > 0, n > 0 ),分别表示接下来有 m 个整数和 n 个浮点数。第二行为 m 个整数,用空格隔开,第三行为 n 个浮点数,用空格隔开。整数的范围不超过 int 可表示范围,浮点数的范围不超过 double 可表示的范围。

输出描述

对于每一个测例,输出两行,第一行为m个整数的中位数,第二行为n个浮点数的中位数。

示例1:

输入:4 5

           1 2 3 4

           10.01 0.003 255.256 -3.2 100000.3

输出:3

          10.01

#include <iostream>
#include<algorithm>
#include<cmath>
#include <cassert> 
using namespace std;

/*
template <class T>
void outputmedian(T array, int count)
{
  insertionSort(array, count);
  
  T median;
  int k=floor(count / 2);
  median = array[k+1];
  
  cout << median << endl;
}
*/

template <class T> //数组类模板定义
class Array {
private:
  T* list; //用于存放动态分配的数组内存首地址
  int size; //数组大小(元素个数)
public:
  Array(); //默认构造函数
  Array(int sz); //构造函数
  // Array(int sz = 50); //构造函数
  Array(const Array<T> &a); //复制构造函数
  ~Array(); //析构函数
  Array<T> & operator = (const Array<T> &rhs); //重载"=“
  T & operator [] (int i); //重载"[]”
  const T & operator [] (int i) const; //重载"[]”常函数
  operator T * (); //重载到T*类型的转换
  operator const T * () const;//重载到T*常类型的转换
  int getSize() const; //取数组的大小
  void resize(int sz); //修改数组的大小
  // 升序排列数组元素、再取中位数:
  void insertionSortAndOutputmedian(Array<T> &a, int n); 
  // void outputmedian(Array<T> &a, int size); // 取数组元素的中位数
};

template <class T> // 函数模板:直接插入排序+输出中位数
void Array<T>::insertionSortAndOutputmedian(Array<T> &a, int n)
{
  // 直接插入排序,把数组元素升序排列:
  int i, j;
  T temp;
  for (int i = 1; i < n; i++) {
    int j = i;
    T temp = a[i];
    while (j > 0 && temp < a[j - 1]) {
      a[j] = a[j - 1];
      j--;
    }
    a[j] = temp;
  }
  // 输出中位数:
  T median;
  // int k = floor(size / 2);
  median = a[size/2]; // size为int型数据,除法 自动符合题目要求。
  cout << median << endl;
}

/*
template <class T>
void Array<T>::outputmedian(Array<T> &a, int size) // 中位数输出函数
{  
  insertionSort(a, size); 
  T median;
  int k=floor(size / 2);
  median = a[k+1];
  cout << median << endl;
}
*/

template <class T> Array<T>::Array(int sz) {//构造函数
  assert(sz >= 0);//sz为数组大小(元素个数),应当非负
  size = sz; // 将元素个数赋值给变量size
  list = new T [size]; //动态分配size个T类型的元素空间
}
template <class T> Array<T>::~Array() { //析构函数
  delete [] list;
}
template <class T>
Array<T>::Array(const Array<T> &a) { //复制构造函数
  size = a.size; //从对象x取得数组大小,并赋值给当前对象的成员
  list = new T[size]; // 动态分配n个T类型的元素空间
  for (int i = 0; i < size; i++) //从对象X复制数组元素到本对象
    list[i] = a.list[i];
}
//重载"="运算符,将对象rhs赋值给本对象。实现对象之间的整体赋值
template <class T>
Array<T> &Array<T>::operator = (const Array<T>& rhs) {
  if (&rhs != this) {
//如果本对象中数组大小与rhs不同,则删除数组原有内存,然后重新分配
    if (size != rhs.size) {
      delete [] list; //删除数组原有内存
      size = rhs.size; //设置本对象的数组大小
      list = new T[size]; //重新分配size个元素的内存
    }
 //从对象X复制数组元素到本对象
    for (int i = 0; i < size; i++)
      list[i] = rhs.list[i];
  }
  return *this; //返回当前对象的引用
}
//重载下标运算符,实现与普通数组一样通过下标访问元素,具有越界检查功能
template <class T>
T &Array<T>::operator[] (int n) {
  assert(n >= 0 && n < size); //检查下标是否越界
  return list[n]; //返回下标为n的数组元素
}
template <class T>
const T &Array<T>::operator[] (int n) const {
  assert(n >= 0 && n < size); //检查下标是否越界
  return list[n]; //返回下标为n的数组元素
}
//重载指针转换运算符,将Array类的对象名转换为T类型的指针
template <class T>
Array<T>::operator T * () {
  return list; //返回当前对象中私有数组的首地址
}
//取当前数组的大小
template <class T>
int Array<T>::getSize() const {
  return size;
}
// 将数组大小修改为sz
template <class T>
void Array<T>::resize(int sz) {
  assert(sz >= 0); //检查sz是否非负
  if (sz == size) //如果指定的大小与原有大小一样,什么也不做
    return;
  T* newList = new T [sz]; //申请新的数组内存
  int n = (sz < size) ? sz : size;//将sz与size中较小的一个赋值给n
 //将原有数组中前n个元素复制到新数组中
  for (int i = 0; i < n; i++)
    newList[i] = list[i];
  delete[] list; //删除原数组
  list = newList; // 使list指向新数组
  size = sz; //更新size
}

int main()
{
  int m, n;
  cin >> m >> n; // 输入整数个数、浮点数个数
  Array<int> a(m); // 数组类模板对象
  Array<double> b(n); // 数组类模板对象
  for (int i = 0; i < m; i++) // 循环输入数组元素
    cin >> a[i];
  for (int i = 0; i < n; i++) // 循环输入数组元素
    cin >> b[i];
  a.insertionSortAndOutputmedian(a, m); // 直接插入排序,再输出中位数
  b.insertionSortAndOutputmedian(b, n);
  return 0;  
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值