目录
冒泡算法介绍
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行,直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
在我们用冒泡算法实现qsort函数时还用到了回调函数,下面我们介绍一下回调函数:
回调函数
回调函数就是一个被作为参数传递的函数。在C语言中,回调函数只能使用函数指针实现,在C++、Python、ECMAScript等更现代的编程语言中还可以使用仿函数或匿名函数。
回调函数的使用可以大大提升编程的效率,这使得它在现代编程中被非常多地使用。同时,有一些需求必须要使用回调函数来实现。
最著名的回调函数调用有C/C++标准库stdlib.h/cstdlib中的快速排序函数qsort和二分查找函数bsearch中都会要求的一个与strcmp类似的参数,用于设置数据的比较方法。
实现
首先演示一下qsort函数使用:
#include<stdio.h> #include<stdlib.h> //qsort函数的使用者得实现一个比较函数 int int_cmp(const void *p1, const void *p2) { return (*(int *)p1 - *(int *)p2); } int main() { int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 }; int i = 0; //void qsort( void *base, size_t num, size_t width, // int (__cdecl *compare )(const void *elem1, const void *elem2 ) ); qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp); for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) { printf("%d ", arr[i]); } printf("\n"); return 0; }
冒泡函数实现qsort函数:
#include<stdio.h> #include<string.h> //实现字符串比较函数 int int_str(const void * p1, const void *p2) { return strcmp(*(char **)p1,*(char **)p2); } //实现整数比较函数 int int_cmp(const void * p1, const void * p2) { return (*(int *)p1 - *(int *)p2); } //实现位置调换 void _swap(void *p1, void *p2, int size) { int i = 0; for (i = 0; i < size; i++) { char tmp = *((char *)p1 + i); *((char *)p1 + i) = *((char *)p2 + i); *((char *)p2 + i) = tmp; } } //冒泡算法 void bubble(void *base, int count, int size, int(*cmp )(const void *,const void *)) { int i = 0; int j = 0; for (i = 0; i < count-1; i++) { for (j = 0; j < count-1-i; j++) { if (cmp((char *)base + j*size, (char *)base + (j + 1)*size) > 0) { _swap((char *)base + j*size, (char *)base + (j + 1)*size, size); } } } } int main() { //int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 }; char *arr[] = {"aaaa","dddd","cccc","Bbbb"}; int i = 0; bubble(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_str); for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) { printf("%s ", arr[i]); } printf("\n"); return 0; }