// 快速排序
// O(n^2), 但是如果middle取得比较好的话,时间复杂度为O(nlogn)
// 所以普遍认为是nlogn
// 不需要额外的存储空间,是一般情况下最好的排序方法。
#include "sort.h"
int partition(void *data, int size, int esize, int i, int k,
int (*compare)(const void *key1, const void *key2))
{
int *a = (int *)data;
int *temp;
int r[3], middle;
r[0] = rand() % (k - i + 1) + i; // 利用快排找到三个随机数的中位数
r[1] = rand() % (k - i + 1) + i;
r[3] = rand() % (k - i + 1) + i;
issort(r, 3, esize, compare);
middle = a[r[1]];
if ((temp = (int *)malloc(sizeof(int))) == NULL)
{
return -1;
}
while(i <= k)
{
while (compare(&middle, &a[i]) > 0) // 定位左边的位置
{
i++;
}
while(compare(&middle, &a[k]) < 0) // 定位右边的位置
{
k--;
}
if (i <= k) // 交换位置
{
memcpy(temp, &a[k], sizeof(int));
memcpy(&a[k], &a[i], sizeof(int));
memcpy(&a[i], temp, sizeof(int));
i++;
k--;
}
else
{
break;
}
}
free(temp);
return k;
}
int qksort(void *data, int size, int esize, int i, int k,
int (*compare)(const void *key1, const void *key2))
{
int j = (k + i - 1) / 2; // 中间值
while (i <= k)
{
if (j = partition(data, k - i + 1, esize, i, k, compare) < 0) // 取中间值
{
return -1;
}
if (qksort(data, k - j + 1, esize, i, j, compare) < 0) // 对左边递归
{
return -1;
}
i = j + 1; // 对右边递归
}
}
算法精解(二)——快速排序
最新推荐文章于 2014-10-20 17:19:19 发布