-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathQuickSelect.cpp
80 lines (67 loc) · 1.96 KB
/
QuickSelect.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
// Find kth smallest element in array, Quikselect algorithm
// Techie Delight https://www.techiedelight.com/quickselect-algorithm/
// Leetcode https://leetcode.com/explore/interview/card/top-interview-questions-medium/110/sorting-and-searching/800/
#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
void print(const std::vector<int> nums)
{
for (auto n : nums) {
std::cout << n << " ";
}
}
int partition(std::vector<int>& nums, int left, int right, int pIndex)
{
int pivot = nums[pIndex];
std::swap(nums[right], nums[pIndex]);
pIndex = left;
for (int i = left; i < right; ++i) {
if (nums[i] <= pivot) {
std::swap(nums[i], nums[pIndex]);
pIndex++;
}
}
std::swap(nums[pIndex], nums[right]);
return pIndex;
}
int quickselect(std::vector<int>& nums, const int k, int left, int right)
{
if (left == right) {
return nums[left];
}
int pIndex = left + rand() % (right - left + 1);
pIndex = partition(nums, left, right, pIndex);
if (pIndex + k == nums.size()) {
return nums[pIndex];
} else if (pIndex + k < nums.size()) {
return quickselect(nums, k, pIndex + 1, right);
} else {
return quickselect(nums, k, left, pIndex - 1);
}
}
int quickselect(std::vector<int>& nums, const int k)
{
if (nums.empty() || k <= 0 || k > nums.size()) {
return INT_MIN;
}
return quickselect(nums, k, 0, nums.size() - 1);
}
void test(std::vector<int>& nums, std::vector<int> kArray)
{
std::cout << "Array : ";
print(nums);
std::cout << "\n";
for (auto k : kArray) {
std::cout << k << " th smallest using quick select algo : ";
std::cout << quickselect(nums, k) << "\n";
}
std::cout << "=============================================\n";
}
int main()
{
std::vector<int> nums {7, 4, 6, 3, 9, 1};
std::vector<int> kArray {-1, 0, 1, 2, 5, 6, 7};
test(nums, kArray);
return 0;
}