private static void Swap(int[] nums, int i, int j){
private static int Partition(int[] nums, int start, int end){
var chosenPivot = nums[origEnd];
while (start < origEnd && nums[start] < chosenPivot) start++;
while (end >= origStart && nums[end] > chosenPivot) end--;
Swap(nums,origEnd,end+1);
public static void Shuffle(int[] nums){
Random rand = new Random();
for (int i = nums.Length-1; i >= 1; i--){
var randomPos = rand.Next(0,i);
Console.WriteLine("shuffled: ");
foreach (var num in nums){
Console.Write(num + " ");
public static int FindKthLargest(int[] nums, int k) {
int end = nums.Length - 1;
var pivotPosition = Partition(nums,start,end);
if (wantedIndex == pivotPosition)
else if (wantedIndex < pivotPosition)
start = pivotPosition + 1;
return nums[wantedIndex];
public static void Main()
var nums = new int[6]{3,2,1,5,6,4};
foreach (var num in nums){
Console.Write(num + " ");
Console.WriteLine("k: " + k);
Console.WriteLine(FindKthLargest(nums,k));