CVTE面试题 —— 给定一个数组,找出第k大的数及其下标
快排思路解法:时间复杂度O(n)
#include<iostream>
#include<cassert>
using namespace std;
int partition(int *arr, int n, int low, int high)
{
assert(arr != nullptr && n > 0 && low >= 0 && high < n);
int value = arr[low];
while (low < high)
{
while (low<high && arr[high] >= value)
high--;
arr[low] = arr[high];
while (low < high && arr[low] <= value)
low++;
arr[high] = arr[low];
}
arr[low] = value;
return low;
}
int getKthNum(int *arr, int size, int k)
{
assert(arr != nullptr && size > 0 && k > 0 && k <= size);
int begin = 0;
int end = size - 1;
int index = partition(arr, size, begin, end);
while (index != k)
{
if (index > k)
{
index = partition(arr, size, begin, index - 1);
}
else
index = partition(arr, size, index + 1, end);
}
int result = arr[k];
return result;
}
int main()
{
int arr[] = { 8, 5, 3, 5, 4, 7, 2, 5, 1, 3 };
int size = sizeof(arr) / sizeof(arr[0]);
int *arr2 = new int[size];
for (int i = 0; i < size; i++)
arr2[i] = arr[i];
int result=getKthNum(arr, size, 3);
for (auto m : arr)
cout << m << " ";
cout << endl << result << endl;
for (int i = 0; i < size; i++)
{
if (arr2[i] == result)
cout << i << endl;
}
return 0;
}