【算法宝典】序列中第k小的数问题

目录

第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);
}
发布了337 篇原创文章 · 获赞 43 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/dghcs18/article/details/103351374
今日推荐