/*
 * main.c
 *
 *  Created on: 2010-10-27
 *      Author: Jenson
 */

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

int fncmp(const void * a, const void * b);

void insert_sort(void ** arr, int n, int(* cmp)(const void *,
        const void *));

int main() {
    int(*cmp)(const void *, const void *) = &fncmp;

    int *values[7] = { 0, -1, -2, 3, 4, -55 };
    int **arr = values;
    insert_sort(arr, 6, cmp);
 
    int i;
    for (i = 0; i < 6; i++) {
        printf("%d\t", arr[i]);
    }
    return 0;
}

int fncmp(const void *a, const void *b) {
    int aa = a;
    int bb = b;
    printf("%d,%d\t", aa, bb);
    if (aa > bb) {
        return 1;
    } else if (aa == bb) {
        return 0;
    } else {
        return -1;
    }
}

void insert_sort(void ** arr, int n, int(* cmp)(const void *,
        const void *)) {
    int j;
    for (j = 1; j < n; j++) {
        void * value = arr[j];
        int i = j - 1;
        while (i >= 0 && cmp(arr[i], value) > 0) {
            arr[i + 1] = arr[i];
            i--;
        }
        arr[i + 1] = value;
    }
}

上述算法对数组arr进行插入排序,并且通过函数指针cmp调用fncmp函数进行比较两个数值的大小。
上述算法还可以扩展到字符串的排序,只要实现将函数fncmp进行改变即,无需将insertSortByPointers函数进行改变。这样就提高了程序的灵活性。
该算法的最好情况是O(n),平均情况是O(n^2),最坏情况是O(n^2)。