理解C中的函数指针和插入排序

时间:2016-01-30 09:14:31

标签: c

我正在尝试使用与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);
}

非常感谢!

1 个答案:

答案 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--;
        }
    }
}