问题描述:选择一组N个数,选择其中最大的第K个数
解法1:线排序,后选择;
解法2:先读k个数并排序(递减),然后依次读取后面的数,与已排序的数组进行比较,若小则舍去,大则保留。
代码
/*
问题描述:一组N个数确定其中第K个最大者
*/
#include <iostream>
using namespace std;
/*success return 0, fail return -1*/
void BuddleSort(int arr[], int size)
{
int tmp;
for (int i=0; i<size-1; ++i)
{
for (int j=0; j<size-i-1; ++j)
{
if (arr[j] > arr[j+1])
{
tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
}
bool SelectKth(int arr[], int size, int k, int& val)
{
if (k<1 || k>size)
return false;
BuddleSort(arr,size);
val = arr[k-1];
return true;
}
bool SelectKth1(int arr[], int size, int k, int& val)
{
if (k<1 || k>size)
return false;
//sort the first k element
BuddleSort(arr,k);
for (int i=k; i<size; ++i)
{
if (arr[i] > arr[0])
{
arr[0] = arr[i];
}
}
val = arr[k-1];
return true;
}
void print(int arr[], int size)
{
for (int i=0; i<size; ++i)
{
cout << arr[i] << " ";
}
cout << endl;
}
int main(void)
{
//input
int n;
cout << "input size of arr: " << endl;
cin >> n;
int *arr = new int[n];
cout << "input element of arr: " << endl;
for (int i=0; i<n; ++i)
{
cin >> arr[i];
}
cout << "the arr is: " << endl;
print(arr,n);
int val,k;
//seclect
cout << "input k: " << endl;
cin >> k;
//
cout << "-----------------first way to solve----------------" << endl;
if (SelectKth(arr,n,k,val))
cout << "the kth in arr is: " << val << endl;
else
cout << "k out of size " << endl;
cout << "---------------second way to solve ------------" << endl;
if (SelectKth(arr,n,k,val))
cout << "the kth in arr is: " << val << endl;
else
cout << "k out of size " << endl;
return 0;
}