仿qsort写的原地插入排序,用void *实现各种类型数组的传递,调用是需自己写一个比较数组成员大小的函数
/*
*参数:
* array: 需排序的数组
* nmemb: 数组成员数
* memsize: 每个数组成员的大小
* compar: 用于比较成员大小的函数
*
*输出:
* 无返回值,排序后的数组存于原数组中
*/
void InsertionSortAllType(void *array, size_t nmemb, size_t memsize, int (*compar)(const void *, const void *))
{
//假定array【i】之前的数组都是已排序的,从array【i-1】向前搜索,找到array【i】应该在的位置,将其插入
int i, j;
void *key = malloc(memsize); //用于暂存array[i]
for (i = 1; i < nmemb; i++) {
memcpy(key, array + (i * memsize), memsize); //存array【i】
for (j = i - 1; j >= 0; j--) {
if (compar(key, array + j * memsize) < 0) {
memcpy(array + (j + 1) * memsize, array + j * memsize, memsize); //从array【i - 1】向前搜索,比key大的向后挪一个位置
} else
break;
}
memcpy(array + (j + 1) * memsize, key, memsize); //找到正确位置,插入key
}
}
//例子
#include
#include
#include "sort.h"
#define SIZE 8
void Print(char A[]);
int compare(const void *a, const void *b);
int main(void)
{
char A[SIZE];
int i;
for (i = 0; i < 8; i++) {
scanf("%c", &A[i]);
getchar();
}
Print(A);
InsertionSortAllType(A, SIZE, sizeof(char), compare);
Print(A);
return 0;
}
//遍历数组
void Print(char A[])
{
int i;
for (i = 0; i < SIZE; i++)
printf("%c ", A[i]);
printf("\n");
}
//用于比较数组成员大小的函数
int compare(const void *a, const void *b)
{
if(*(char*)a > *(char*)b)
return 1;
else if (*(char*)a == *(char*)b)
return 0;
else
return -1;
}
阅读(160) | 评论(0) | 转发(0) |