#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