qsort学习及改造冒泡排序能排序任何数
- qsort的使用
qsort的使用
这个函数也不是很复杂!!!
qsort(void*base,size_t num,size_t width,int(int (__cdecl *compare )(const void *elem1, const void *elem2 )))
void * base,为数组的基地址,size_t num为数组的元素个数,size_t width 元素的大小,也就是偏移量,int(int (__cdecl *compare )(const void *elem1, const void *elem2 ))这个是函数指针,用来接受函数的地址,elem1指向第一个比较元素的地址,elem2指向第二个比较元素的地址!!!
int cmp_int(const void* p1, const void* p2)
{return *(int*)p1 - *(int*)p2;
}int main()
{int arr[10] = { 5,3,2,1,6,7,9,8,4,0 };int sz = sizeof(arr) / sizeof(int);qsort(arr, sz, sizeof(int), cmp_int);for (int i = 0; i < sz; i++){printf("%d ", arr[i]);}printf("\n");return 0;
}
下面模拟的通用的冒泡排序!!!
void Swap(char* buffer1, char* buffer2, size_t width)
{for (int i = 0; i < width; i++){char tmp = *buffer1;*buffer1 = *buffer2;*buffer2 = tmp;buffer1++;buffer2++;}
}void bubble_sort(void* base,size_t num,size_t width,int (*cmp)(const void* p1,const void* p2))
{for (int i = 0; i < num-1; i++){for (int j = 0; j < num - 1 - i; j++){//把每次比较的元素的首地址,传到p1和p2;if ((*cmp)((char*)(base)+j * width, (char*)(base)+(j + 1) * width) > 0) {//交换Swap((char*)(base)+j * width, (char*)(base)+(j + 1) * width,width);}}}
}int cmp_int(const void* p1, const void* p2)
{return *(int*)p1 - *(int*)p2;
}int main()
{int arr[10] = { 5,3,2,1,6,7,9,8,4,0 };int sz = sizeof(arr) / sizeof(int);bubble_sort(arr, sz,sizeof(int),cmp_int);for (int i = 0; i < sz; i++) {printf("%d ", arr[i]);}printf("\n");return 0;
}
完结!!!