快速排序在最坏的情况下时间复杂度Ω(nlgn)
1⃣️在元素各异时或者少量相等(元素个数n>70)
时间复杂度Ω(nlgn)
void quick_sort_by_median(int *array,int start,int end)
{
if(start<end)
{
int median = select(array,start,end,(end - start + 1)/2 + (end - start + 1) % 2);
int middle = partition(array,start,end,median);
quick_sort_by_median(array,start,middle-1);
quick_sort_by_median(array,middle+1,end);
}
}
2⃣️在有大量元素相同时(元素个数n>70)
时间复杂度Ω(nlgn)
KeyValuePair partition_contains_equal_elements(int *array,int start,int end,int key)
{
//line.key表示已排序中最后一个小于key的元素的位置
//line.value表示已排序中最后一个等于key的元素的位置
KeyValuePair line(start - 1,start - 1);
for (int i = start; i < end + 1; ++i) {
if(array[i]<key)
{
line.key++;
line.value++;
int temp = array[i];
array[i] = array[line.value];
array[line.value] = array[line.key];
array[line.key] = temp;
}
else if(array[i] == key)
{
line.value++;
array[i] = array[line.value];
array[line.value] = key;
}
}
return line;
}
void quick_sort_by_median_contains_equal_elements(int *array,int start,int end)
{
if(start<end)
{
int median = select(array,start,end,(end - start + 1)/2 + (end - start + 1)%2);
KeyValuePair middle_line = partition_contains_equal_elements(array,start,end,median);
quick_sort_by_median(array,start,middle_line.key);
quick_sort_by_median(array,middle_line.value + 1,end);
}
}