快速排序 quicksort

爷,独闯天下 提交于 2021-01-27 06:34:46

    快速排序是一种最常见的高效排序算法,时间复杂度为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
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!