说明:《数据结构与算法分析》第一章练习1.1,”选择问题“。使用第二种算法(先读取前k个元素)。
/* sele_2.cpp : 选择问题
一组N个数,要确定其中第k(k=N/2)个最大者
从文件"d:\\numbers.txt"中读取这N个数
*/
#include "stdafx.h"
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
# define N 10
void main()
{
ifstream inFile;
const int k=N/2;
int a[k]={0}; //存储所读取的数
inFile.open("d:\\numbers.txt"); //读取文件
if(inFile.is_open()){
for(int m=0;m<k;m++) //读取前k个数
{ inFile >> a[m];
// cout<<a[m];
}
//将这k个数从大到小排序,冒泡排序
int buf;
for(int i=0;i<k;i++)
{ for(int j=i+1;j<k;j++)
{
if(a[j]>a[i])
{ buf=a[i]; a[i]=a[j]; a[j]=buf;}
}
}
//对之后的输入数字。若它小于a[k-1]则丢弃,否则将其放到数组中正确的位置
int number; //每次输入的数字
for(i=k;i<N;i++)
{
inFile>>number;
if(number<=a[k-1]) break; //丢弃
//寻找number正确的位置
int cursor;
if(a[0]<number) cursor=0;
else{
for(i=0;i<k-1;i++)
{
if(a[i]>number&&a[i+1]<number) cursor=i+1;
}
}
//查找完number的正确位置后,数组a部分右移进行插入
for(i=k-1;i>cursor;i--) a[i]=a[i-1];
a[cursor]=number;
}
cout<<a[k-1];
}
}