24 lines
762 B
Plaintext
24 lines
762 B
Plaintext
fcn qselect(list,nth){ // in place quick select
|
|
fcn(list,left,right,nth){
|
|
if (left==right) return(list[left]);
|
|
pivotIndex:=(left+right)/2; // or median of first,middle,last
|
|
|
|
// partition
|
|
pivot:=list[pivotIndex];
|
|
list.swap(pivotIndex,right); // move pivot to end
|
|
pivotIndex := left;
|
|
i:=left; do(right-left){ // foreach i in ([left..right-1])
|
|
if (list[i] < pivot){
|
|
list.swap(i,pivotIndex);
|
|
pivotIndex += 1;
|
|
}
|
|
i += 1;
|
|
}
|
|
list.swap(pivotIndex,right); // move pivot to final place
|
|
|
|
if (nth==pivotIndex) return(list[nth]);
|
|
if (nth<pivotIndex) return(self.fcn(list,left,pivotIndex-1,nth));
|
|
return(self.fcn(list,pivotIndex+1,right,nth));
|
|
}(list.copy(),0,list.len()-1,nth);
|
|
}
|