快速排序是所有排序算法中最有价值的一个,因为它的平均性能是最好的。所以很多Linux/Unix系统中默认采用的排序算法就是快速排序。它的时间复杂度,最好和平均情况下为:O(n•logn) 最坏的情况下退化为:O(n2)
本文所指的基本快速排序,是未经特别优化的快速排序。围绕快速排序的分区策略进行优化的算法有很多,在此先不介绍,以后再深入讨论。
代码如下:
void do_quicksort(void** array, size_t left, size_t right, int(*cmp)(const void *, const void *))
{
size_t i;
size_t j;
void *value;
if (left < right)
{
i = left;
j = right;
value = array[left];
while (i < j)
{
while (i < j && cmp(array[j], value) >= 0)
{
j--;
}
if (i < j)
{
array[i++] = array[j];
}
while (i < j && cmp(array[i], value) < 0)
{
i++;
}
if (i < j)
{
array[j--] = array[i];
}
}
array[i] = value;
do_quicksort(array, left, i - 1, cmp);
do_quicksort(array, i + 1, right, cmp);
}
}
void QuickSort(void** array, size_t count, int(*cmp)(const void *, const void *))
{
if (array == NULL || count <= 1)
{
return;
}
do_quicksort(array, 0, count - 1, cmp);
}
测试:
int _tmain(int argc, _TCHAR* argv[])
{
Item items[5];
items[0].HardwareId = 0x0102; items[0].RangeId = 0x0304;
items[1].HardwareId = 0x0506; items[1].RangeId = 0x0708;
items[2].HardwareId = 0x0102; items[2].RangeId = 0x0303;
items[3].HardwareId = 0x0708; items[3].RangeId = 0x0304;
items[4].HardwareId = 0x0607; items[4].RangeId = 0x0405;
QuickSort((void**)items, 5, cmpAsItem);
return 0;
}
结果:
排序前:
排序后: