您的位置:首页 > 产品设计 > UI/UE

快速排序 quicksort

2014-04-10 00:00 344 查看
摘要: C实现快速排序 quicksort

快速排序是一种最常见的高效排序算法,时间复杂度为O(n2),但是平均的时间复杂度是O(n·lgn)。而且可以证明,随机选取参照值的快速排序的时间复杂度期望值为O(n·lgn)。

C语言中已经存在快速排序的函数qsort:

#include <stdlib.h>

void qsort(void *base, size_t nmemb, size_t size,
int(*compar)(const void *, const void *));


本文
仿照该函数的结构,提供了随机化快速排序的一种实现,还包括了两个可以作为函数指针参数的比较函数,分别是整形比较函数comparInt和字符串比较函数comparStr。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void *quicksort(void *base, size_t nmeb, size_t size, int(*compar)(const void *, const void *))
{
if (nmeb < 2)
return;

int i, j, key;

key = rand() % nmeb;
swap(base, base + key * size, size);

i = 1;
j = nmeb - 1;
while (i < j) {
if (compar(base + i * size, base) > 0) {
swap(base + i * size, base + j * size, size);
--j;
} else
++i;
}

if (compar(base, base + i * size) > 0)
swap(base, base + i * size, size);

quicksort(base, i, size, compar);
quicksort(base + i * size, nmeb - i, size, compar);
}

void swap(void *p1, void *p2, size_t size)
{
void *temp;

temp = malloc(size);
if (temp == NULL) {
exit(EXIT_FAILURE);
}

memcpy(temp, p1, size);
memcpy(p1, p2, size);
memcpy(p2, temp, size);

free(temp);
}

static int comparStr(const void *p1, const void *p2)
{
return strcmp(* (char * const *) p1, * (char * const *) p2);
}

static int comparInt(const void *p1, const void *p2)
{
return (*(const int *) p1 - *(const int *) p2);
}


简单的测试代码如下:

int main(int argc, char *argv[])
{
int i;
int arr[5] = {4, 2, 1, 3, 5};

srand(time(NULL));

printf("Integer Sort\n");
printf("Original: ");
for (i = 0; i < 5; i++)
printf("%d ", arr[i]);
printf("\n");

quicksort(arr, 5, sizeof(int), comparInt);

printf("Sorted  : ");
for (i = 0; i < 5; i++)
printf("%d ", arr[i]);
printf("\n\n");

if (argc < 2)
exit(EXIT_SUCCESS);

printf("String Sort\n");
printf("Original: ");
for (i = 1; i < argc; i++)
printf("%s ", argv[i]);
printf("\n");

quicksort(&argv[1], argc - 1, sizeof(argv[1]), comparStr);
printf("Sorted  : ");
for (i = 1; i < argc; i++)
printf("%s ", argv[i]);
printf("\n");

exit(EXIT_SUCCESS);
}


运行结果如下:

roo@ubuntu:~$ ./a.out linux windows mac
Integer Sort
Original: 4 2 1 3 5
Sorted  : 1 2 3 4 5

String Sort
Original: linux windows mac
Sorted  : linux mac windows
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  快速排序 quicksort