快速排序在最坏的情况下时间复杂度Ω(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);}
}
辅助函数select和partition
链接地址
辅助类KeyValuePair
链接地址