/*
quick_sort.c
yangjie 2011-03-16 21:33
*/
#include <stdio.h>
typedef int (*CallbackFunc)(void *a, void *b);
void quick_sort(void **arr, size_t left, size_t right, CallbackFunc cmp);
int cmp(void *a, void *b);
void qsearch(void **arr, size_t low, size_t hight, CallbackFunc cmp, void *data);
int main(int argc, char *argv[])
{
int arr[] = {1, 4, 3, 2, 7, 6, 9, 0, 5, 8};
quick_sort(arr, 0, 9, cmp);
int i = 0;
for (i = 0; i < 10; i ++) {
printf("%d\n", arr[i]);
}
int a = 4;
qsearch(arr, 0, 9, cmp, a);
return 0;
}
void quick_sort(void **arr, size_t left, size_t right, CallbackFunc cmp)
{
size_t save_left = left;
size_t save_right = right;
void *x = arr[left];
while (left < right) {
while ((cmp(arr[right], x) > 0) && (right > left)) right --;
if (left < right) {
arr[left] = arr[right];
left ++;
}
while ((cmp(arr[left], x) <= 0) && (right > left)) left ++;
if (left < right) {
arr[right] = arr[left];
right --;
}
}
arr[left] = x;
if (save_left < left) {
quick_sort(arr, save_left, left - 1, cmp);
}
if (save_right >= left) {
quick_sort(arr, left + 1, save_right, cmp);
}
}
int cmp(void *a, void *b)
{
return (int)a - (int)b;
}
void qsearch(void **arr, size_t low, size_t high, CallbackFunc cmp, void *data)
{
int mid = low + (high - low)>>1;
if (cmp(arr[mid], data) == 0) {
printf("the position is %d\n", mid);
} else if (cmp(arr[mid], data) > 0) {
qsearch(arr, low, mid, cmp, data);
} else {
qsearch(arr, mid, high, cmp, data);
}
}
转载于:https://my.oschina.net/tonyyang/blog/14255