插入排序 InsertionSort

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void *insertionSort(void *base, size_t nmeb, size_t size, int(*compar)(const void *, const void *));

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

int comparStr(const void *p1, const void *p2);
int comparInt(const void *p1, const void *p2);

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

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

    insertionSort(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");

    insertionSort(&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);
}

void *insertionSort(void *base, size_t nmeb, size_t size, int(*compar)(const void *, const void *))
{
    int i, j;
    for (i = 1; i < nmeb; i++)
        for (j = i; j > 0; j--)
            if (compar(base + (j - 1) * size, base + j * size) > 0) {
                swap(base + (j - 1) * size, base + j * size, size);
            } else
                break;
}

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

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

    free(temp);
}

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

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


執行結果: linux

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