如何缩短该代码的运行时间?

题目描述
又是一年秋招季,小明手握N个offer(就是企业的录用意向),薪资有高有低,待遇也各有不同,为了方便选择,他对每个offer进行了评分(评分越高越好),但是他不想找最高的也不想找最低的,而是想找一个排名等于他幸运数字的,希望你可以帮帮他。
输入
第一行一个整数N(1<=N<=1000000),表示offer数量。
第二行N个整数,代表offer评分(无序),评分保证大于1,小于1000000,可能存在重复的评分。
第三行一个整数,代表幸运数字L(1<=L<=N)
输出
一个数字,表示小明选择的那个的offer评分。
样例输入 Copy
4
90 28 233 115
2
样例输出 Copy
115

//如果代码错了的话也请指点(手动狗头)
#include<stdio.h>
int main()
{
    int n,t,p,i,j,a[1000000]={0};
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    scanf("%d",&p);
    for(i=0;i<n;i++)
    {
        for(j=i+1;j<n;j++)
        {
            if(a[i]<a[j])
            {
                t=a[i];
                a[i]=a[j];
                a[j]=t;
            }
        }
    }
    printf("%d",a[p-1]);
    return 0;
}

快排

#include <stdio.h>
int a[1000000], n, temp;
int findk(int num[], int k, int s, int e) {
    int l = s, h = e, t = num[l];
    while(l < h) {
        while(l < h && num[h] <= t) {
            h--;
        }
        num[l] = num[h];
        while(l < h && num[l] >= t) {
            l++;
        }
        num[h] = num[l];
    }
    num[h] = t;
    if(h == k - 1)
        return t;
    else if(h > k - 1)
        return findk(num, k, s, h - 1);
    else
        return findk(num, k, h + 1, e);
}
int find(int num[], int k, int n) {
    return findk(num, k, 0, n - 1);
}
int main() {
    int i, p;
    scanf("%d", &n);
    for(i = 0; i < n; i++)
        scanf("%d", &a[i]);
    scanf("%d", &p);
    printf("%d", find(a,p,n));
    return 0;
}

要求是1秒,忘说了