Partition 和快速排序类似,只不过返回的是pivot的下标,pivot前面的数都小于pivot,后面的数都大于pivot
int Partition(int* arr, int begin, int end)
{
int pivot_index =MedianOfThree(arr,begin,end);
int pivot = arr[pivot_index];
Swap(arr[pivot_index], arr[end]);
int left = begin - 1;
int right = end;
while (left < right)
{
do
{
left++;
} while (arr[left] < pivot);
do
{
right--;
} while (arr[right] > pivot);
if (left < right)
{
Swap(arr[left], arr[right]);
}
}
Swap(arr[left], arr[end]);
return left;
}
//begin和end 表示查找的范围,index是相对于begin的下标,例如,如果想找第10小的元素,而begin是5,那么index是(10-5)=5。
下面代码中最后一行,当begin的值变了之后,index也要改变。
int Select(int* arr, int begin, int end, int index)
{
if (begin == end)
{
return arr[begin];
}
int q = Partition(arr, begin, end);
int k = q - begin + 1;
if (k == index)
{
return arr[index];
}
else if (index<k)
{
return Select(arr, begin, q-1, index);
}
else
{
return Select(arr, q + 1, end, index - k);
}
}
static const int len = 200;
int main()
{
int arr[len];
for (int i = 0; i < len; i++)
{
arr[i] = len-i;
}
cout << num << endl;
return 0;
}
下面是运行结果