-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathQuickSelectKthSmallest.cpp
67 lines (53 loc) · 2.19 KB
/
QuickSelectKthSmallest.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
#include <iostream>
using namespace std;
/*———————————————————————————————————————————————————————————————————————————*/
// Standard Lomuto partition function
int partition(int arr[], int low, int high) {
int pivot = arr[high];
int i = (low - 1);
for (int j = low; j <= high - 1; j++) {
if (arr[j] <= pivot) {
i++;
swap(arr[i], arr[j]);
}
}
swap(arr[i + 1], arr[high]);
return (i + 1);
}
/*———————————————————————————————————————————————————————————————————————————*/
// Implementation of QuickSelect
int kthSmallest(int a[], int left, int right, int k) {
while (left <= right) {
// Partition a[left..right] around a pivot and find the position of the pivot
int pivotIndex = partition(a, left, right);
// If pivot itself is the k-th smallest element
if (pivotIndex == k - 1)
return a[pivotIndex];
// If there are more than k-1 elements on left of pivot, then k-th smallest must be on left side.
else if (pivotIndex > k - 1)
right = pivotIndex - 1;
// Else k-th smallest is on right side.
else
left = pivotIndex + 1;
}
return -1;
}
/*———————————————————————————————————————————————————————————————————————————*/
int main(){
int n, k;
cout << "Enter the Number of Elements in the Array : ";
cin >> n;
int arr[n];
cout << "Enter the Elements of the Array : ";
for (int i = 0; i < n; i++){
cin >> arr[i];
}
cout << "\nEnter the value of k : ";
cin >> k;
cout << endl;
for (int i = 0; i < n; i++){
cout << arr[i] << " ";
}
cout << "\nK-th smallest element is " << kthSmallest(arr, 0, n - 1, k);
return 0;
}