目录
第k小数<1>
这个问题看似比较简单,直接排序就可以了嘛!但是
最好的排序算法的复杂度是O(nlogn)的,我们可以用一种方法使得不用排序在O(n)的时间内解决问题。
这里用到了指针的思想,注意我们只用到了思想,但是并没有真的使用到指针。
#include<iostream>
#include<fstream>
#include<algorithm>
using namespace std;
ifstream fin("1.txt");
ofstream fout("2.txt");
int i,j,n,k;
int a[100001],b[100001];
void Swap()
{
swap(a[i],a[j]);
swap(i,j); //这里也需要交换指针保证单词循环中,作为参考的那一个量不变
}
void perform(int begin,int end)
{
i = begin;j = end;
while(i != j)
{
if(i < j)
{
if(a[i] > a[j])
Swap();
else
j--;
}
else
{
if(a[i] < a[j])
Swap();
else
j++;
}
}
if(i == k)
{
for(int l = 1;l <= n;l++)
if(b[l] == a[i])
fout << l;
}
else if(i < k)
{
perform(i + 1,end);
}
else
{
perform(begin,i - 1);
}
}
int main()
{
fin >> n >> k;
for(int l = 1;l <= n;l++)
{
fin >> a[l];
b[l] = a[l];
}
perform(1,n);
}