randomized select

can anyone give me the iterative version of randomized select for finding the ith smallest number

1 Like

didnt quite understand u question… finding ith smallest number ??? in what complexity???

Is this what you are looking for?

void swap(int &x, int &y)
{
	int tmp = x;
	x = y;
	y = tmp;
}

int random_partition(int* arr, int start, int end)
{
	srand(time(NULL));
	int pivotIdx = start + rand() % (end-start+1);
	int pivot = arr[pivotIdx];
	swap(arr[pivotIdx], arr[end]); // move pivot element to the end
	pivotIdx = end;
	int i = start -1;
 
	for (int j = start; j <= end - 1; ++j)
		if (arr[j] <= pivot)
		{
			++i;
			swap(arr[i], arr[j]);
		}

	swap(arr[i+1], arr[pivotIdx]);
	return i+1;
}

int randomized_select(int* arr, int start, int end, int k)
{
	int mid, i;

	while (start <= end)
	{
		if (start == end)
			return arr[start];
		if (k == 0)
			return -1;

		mid = random_partition(arr, start, end);
		i = mid - start + 1;

		if (i == k)
			return arr[mid];
		else if (k < i)
			end = mid - 1;
		else
		{
			start = mid + 1;
			k -= i;
		}
	}
}

Disclaimer: I didn’t code this on my own. Just changed the recursive code from here into iterative code.

And, of course, the program returns kth smallest number. Not ith ;-).