快速排序 quicksort

    快速排序是一種最多見的高效排序算法,時間複雜度爲O(n2),可是平均的時間複雜度是O(n·lgn)。並且能夠證實,隨機選取參照值的快速排序的時間複雜度指望值爲O(n·lgn)linux

    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);
}

    

    簡單的測試代碼以下: shell

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);
}

   

    運行結果以下: ubuntu

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
相關文章
相關標籤/搜索