* 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)。