/*
* main.c
*
* Created on: 2010-10-27
* Author: Jenson
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int fncmp(const void * a, const void * b);
void insert_sort(void * arr, int n, int s, int(*cmp)(const void *,
const void *));
int main() {
int * arr[6] = { 3, -2, 5, 7, 0 ,8};
int (*cmp)(const void *,const void *) = &fncmp;
insert_sort(arr,6,sizeof(int *),cmp);
int i;
printf("\n");
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;
}
}
/**
* 当arr是基于值存储时,这个数组被装入n行,并且分配给它一个固定的大小的内存s。
* 使用比较函数对值进行比较,也就是将值从一个位置复制到另一个位置
*/
void insert_sort(void * arr, int n, int s,
int(*cmp)(const void *, const void *)) {
int j;
void *saved = malloc(s);
for (j = 1; j < n; j++) {
int i = j - 1;
void * value = arr + j * s;
/*从末尾开始遍历,直到i<0或者找到一个相比较小的元素*/
while (i >= 0 && cmp(arr + i * s, value) > 0) {
i--;
}
/*如果已经在其正确位置,那么就没有必要移动,
* 否则保存将插入的值并且移动这一大块内存,将其插入到适当的位置
*/
if (++i == j) {
continue;
}
memmove(saved, value, s);
memmove(arr + (i + 1) * s, arr + i * s, s * (j - i));
memmove(arr + i * s, saved, s);
}
free(saved);
}