#include <stdio.h>
/*
inputs...
*A: pointer to array
n: size of array
k: the item in question
*/
//Swaps
void swap(int *a, int *b){
int temp = *a;
*a = *b;
*b = temp;
}
int partition(int *A, int left, int right){
int pivot = A[right], i = left, x;
for (x = left; x < right; x++){
if (A[x] <= pivot){
swap(&A[i], &A[x]);
i++;
}
}
swap(&A[i], &A[right]);
return i;
}
int quickselect(int *A, int left, int right, int k){
//p is position of pivot in the partitioned array
int p = partition(A, left, right);
//k equals pivot got lucky
if (p == k-1){
return A[p];
}
//k less than pivot
else if (k - 1 < p){
return quickselect(A, left, p - 1, k);
}
//k greater than pivot
else{
return quickselect(A, p + 1, right, k);
}
}
int ksmallest(int *A, int n, int k){
int left = 0;
int right = n - 1;
return quickselect(A, left, right, k);
}
int main()
{
int A[7] = {1,3,8,2,4,9,7};
int k;
printf("%d\n", ksmallest
(A
, 7, k
)); return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgovKgppbnB1dHMuLi4KKkE6IHBvaW50ZXIgdG8gYXJyYXkKbjogc2l6ZSBvZiBhcnJheQprOiB0aGUgaXRlbSBpbiBxdWVzdGlvbgoqLwovL1N3YXBzCnZvaWQgc3dhcChpbnQgKmEsIGludCAqYil7CiAgICBpbnQgdGVtcCA9ICphOwogICAgKmEgPSAqYjsKICAgICpiID0gdGVtcDsKfQoKCmludCBwYXJ0aXRpb24oaW50ICpBLCBpbnQgbGVmdCwgaW50IHJpZ2h0KXsKCiAgICBpbnQgcGl2b3QgPSBBW3JpZ2h0XSwgaSA9IGxlZnQsIHg7CgogICAgZm9yICh4ID0gbGVmdDsgeCA8IHJpZ2h0OyB4KyspewogICAgICAgIGlmIChBW3hdIDw9IHBpdm90KXsKICAgICAgICAgICAgc3dhcCgmQVtpXSwgJkFbeF0pOwogICAgICAgICAgICBpKys7CiAgICAgICAgfQogICAgfQoKICAgIHN3YXAoJkFbaV0sICZBW3JpZ2h0XSk7CiAgICByZXR1cm4gaTsKfQoKCmludCBxdWlja3NlbGVjdChpbnQgKkEsIGludCBsZWZ0LCBpbnQgcmlnaHQsIGludCBrKXsKCiAgICAvL3AgaXMgcG9zaXRpb24gb2YgcGl2b3QgaW4gdGhlIHBhcnRpdGlvbmVkIGFycmF5CiAgICBpbnQgcCA9IHBhcnRpdGlvbihBLCBsZWZ0LCByaWdodCk7CgogICAgLy9rIGVxdWFscyBwaXZvdCBnb3QgbHVja3kKICAgIGlmIChwID09IGstMSl7CiAgICAgICAgcmV0dXJuIEFbcF07CiAgICB9CiAgICAvL2sgbGVzcyB0aGFuIHBpdm90CiAgICBlbHNlIGlmIChrIC0gMSA8IHApewogICAgICAgIHJldHVybiBxdWlja3NlbGVjdChBLCBsZWZ0LCBwIC0gMSwgayk7CiAgICB9CiAgICAvL2sgZ3JlYXRlciB0aGFuIHBpdm90CiAgICBlbHNlewogICAgICAgIHJldHVybiBxdWlja3NlbGVjdChBLCBwICsgMSwgcmlnaHQsIGspOwogICAgfQp9CgppbnQga3NtYWxsZXN0KGludCAqQSwgaW50IG4sIGludCBrKXsKCiAgICBpbnQgbGVmdCA9IDA7IAogICAgaW50IHJpZ2h0ID0gbiAtIDE7IAoKICAgIHJldHVybiBxdWlja3NlbGVjdChBLCBsZWZ0LCByaWdodCwgayk7Cn0KCmludCBtYWluKCkKewoJaW50IEFbN10gPSB7MSwzLDgsMiw0LDksN307CglpbnQgazsKCXNjYW5mKCIlZCIsICZrKTsKCXByaW50ZigiJWRcbiIsIGtzbWFsbGVzdChBLCA3LCBrKSk7CglyZXR1cm4gMDsKfQ==