我正在尝试使用与C中内置的qsort非常相似的参数实现插入排序,但我正在努力找到正确的方法,因为我没有完全掌握函数指针。我将如何将其重写为插入排序(使用函数指针?)
static void sort(char *array, size_t size, int (*cmp)(void*,void*), int
begin, int end) {
if (end > begin) {
void *pivot = array + begin;
int l = begin + size;
int r = end;
while(l < r) {
if (cmp(array+l,pivot) <= 0) {
l += size;
} else if ( cmp(array+r, pivot) > 0 ) {
r -= size;
} else if ( l < r ) {
swap(array+l, array+r, size);
}
}
l -= size;
swap(array+begin, array+l, size);
sort(array, size, cmp, begin, l);
sort(array, size, cmp, r, end);
}
}
void qsort(void *array, size_t nitems, size_t size, int (*cmp)(void*,void*)) {
sort(array, size, cmp, 0, nitems*size);
}
非常感谢!
答案 0 :(得分:2)
您只需通过比较功能替换插入排序算法中的比较运算符。您的函数insertionSort
应该如下所示。:
void insertionSort(void *array, size_t nitems, size_t size, int (*cmp)(void*,void*))
{
size_t i, j;
for ( i = 1; i < nitems; i++ )
{
j = i;
while ( j > 0 && cmp( (char*)array+j-1, (char*)array+j ) > 0 )
// ^^^ call of cmp instead of operator >
{
swap( (char*)array+j-1, (char*)array+j, size );
j--;
}
}
}
我将此源用于Insertion Sort算法。
如果您也希望将交换功能作为参数传递,您可以这样做:
void insertionSort(void *array, size_t nitems, size_t size, int (*cmp)(void*,void*), void (*swapdata)(void*,void*,size_t))
{
size_t i, j;
for ( i = 1; i < nitems; i++ )
{
j = i;
while ( j > 0 && cmp( (char*)array+j-1, (char*)array+j ) > 0 )
{
swapdata( (char*)array+j-1, (char*)array+j, size );
j--;
}
}
}