每日一题-寻找第K大值的位置


title: 每日一题–寻找第K大值的位置
date: 2019-11-16 12:33:12
tags:

  • 算法
  • 快排
  • 每日一题


97.寻找第K大值 (15分)
C时间限制:3000 毫秒 | C内存限制:3000 Kb
题目内容:
在一个整数数组中,寻找第k大值所在位置。假设每个数值都不一样。要求算法时间复杂性通常情况下为线性。
输入描述
包括一个数组长度n,一个k, 以及紧接着的n个整数值。整数之间用空格隔开。
输出描述
第k大值所在位置编号。规定数组的第一个位置编号为0.
输入样例
7 3
1 4 3 9 8 7 2
输出样例
5


#include 

int m, k, a[101], b[101];

/*
	m: 记录数组元素个数
	k: 本题主角
	a: 排序数组
	b: 原始数组
	tmp: 定义快排的起点,用作中间位置 
*/

int fun02(int low, int high){
	int tmp = a[low];
	//一直重复找然后换位置,知道首尾坐标重叠 
	while(low < high){ 
		//从右边找一个小的 
		while (low < high && tmp <= a[high]){
            high--;
        }
        a[low] = a[high];
        //从左边找一个小大的,同时放在后面拿出了小的的位置 
        while (low < high && tmp >= a[low]) {
            low++;
        }
        a[high] = a[low];
	}
	a[low] = tmp;
	return low;
	
}

void fun01(int low, int high){
	if(low < high){
		int mid = fun02(low, high);
		//对左边进行排序
		fun01(low, mid - 1);
		//对右边进行排序
		fun01(mid + 1, high); 
	}
	
} 


int main(){
	
	int res;
	
	scanf("%d%d", &m, &k);
	for(int i = 0; i < m; i++){
		scanf("%d", &a[i]);
	}
	//将原始数组记录好 
	for(int i = 0; i < m; i++){
		b[i] = a[i];
	}
	
	fun01(0, m - 1);
	
	for(int i = 0; i < m; i++){
//		printf("%d ", a[i]);
		if(b[i] == a[m - k]){
			printf("%d", i);
			return 0;
		}
	}
	
	return 0;
} 

思维强的不会,那我们就来个简单点的,先排序,然后写答案。

但是我们不能使用简单的排序,我们要使用时间复杂度较低的,因此我们在这里选择快速排序,然后直接得出答案。

你可能感兴趣的:(算法)