冒泡排序
来源:互联网 发布:常见量化交易算法 编辑:程序博客网 时间:2024/05/20 18:19
【说明】参考维基百科描述,重新编写了冒泡排序。源码已更新于维基百科(维基百科冒泡排序3.2部分)。此处提供源码,详细描述可参考维基百科冒泡排序,欢迎完善新版本。
【代码清单】
typedef.h
/*Author : tandesirTime : 2012-08-21借鉴Li XianJing部分代码, 感谢 Li XianJing <xianjimli@hotmail.com>欢迎访问 http://blog.csdn.net/tandesir*/#ifndef __TYPEDEF_H__#define __TYPEDEF_H__#include <stddef.h>enum {RET_OK,RET_FAIL};typedef int (*DataCompare)(int a, int b);typedef int (*BubbleSort)(DataCompare cmp, int arr[], size_t count);#ifdef __cplusplus#define DECLS_BEGIN extern "C" {#define DECLS_END }#else#define DECLS_BEGIN #define DECLS_END #endif/* __cplusplus */#define DEBUG_PRINT(FORMAT, VALUE) printf("File %s line %d: "\#VALUE " = " FORMAT "\n"\,__FILE__, __LINE__,VALUE\);#define LENGTH(array) (sizeof(array)/sizeof(array[0])) #define return_if_fail(p) if(!(p)) \{printf("%s : %d Warning : "#p" failed.\n",\__func__, __LINE__); return ;}#define return_val_if_fail(p, ret) if(!(p))\{printf("%s : %d Warning : "#p" failed.\n",\__func__, __LINE__); return (ret);}#endif/*__TYPEDEF_H__*/
bubble_sort.h
/*Author : tandesirTime : 2012-08-21借鉴Li XianJing部分代码, 感谢 Li XianJing <xianjimli@hotmail.com>欢迎访问 http://blog.csdn.net/tandesir*/#ifndef __BUBBLE_SORT_H__#define __BUBBLE_SORT_H__#include "typedef.h"DECLS_BEGIN int cmp_int(int a, int b);int cmp_int_invert(int a, int b);int bubble_sort_1(DataCompare cmp ,int arr[], size_t count);int bubble_sort_2(DataCompare cmp ,int arr[], size_t count);int bubble_sort_3(DataCompare cmp ,int arr[], size_t count);int bubble_sort_4(DataCompare cmp ,int arr[], size_t count);int bubble_sort(DataCompare cmp ,BubbleSort sort, int arr[], size_t count);DECLS_END#endif
bubble_sort.c
/*Author : tandesirTime : 2012-08-21借鉴Li XianJing部分代码, 感谢 Li XianJing <xianjimli@hotmail.com>欢迎访问 http://blog.csdn.net/tandesir*/#include <stdio.h>#include <assert.h>#include "bubble_sort.h"#include "typedef.h"int cmp_int(int a, int b){return a - b;}int cmp_int_invert(int a, int b){return b - a;}/* 冒泡排序(1) i∈[N-1,0) //循环N-1遍 j∈[N-1,N-i-1) //每遍循环要处理的无序部分 swap(j,j-1) //两两排序(升序/降序)*/int bubble_sort_1(DataCompare cmp ,int arr[], size_t count){printf("bubble_sort_1:\n");size_t i, j;int temp;if(count < 2){return RET_OK;}for(i = count - 1; i > 0; i--){for(j = count - 1; j > count - 1 - i; j--){if(cmp(arr[j-1], arr[j]) > 0){ temp = arr[j];arr[j] = arr[j-1];arr[j-1] = temp;}}}return RET_OK;}/* 冒泡排序(2) i∈[0,N-1) //循环N-1遍 j∈[0,N-1-i) //每遍循环要处理的无序部分 swap(j,j+1) //两两排序(升序/降序)*/int bubble_sort_2(DataCompare cmp ,int arr[], size_t count){printf("bubble_sort_2:\n");size_t i, j;int temp;if(count < 2){return RET_OK;}for(i = 0; i < count - 1; i++){for(j = 0; j < count - 1 - i; j++){if(cmp(arr[j], arr[j+1]) > 0){ temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}return RET_OK;}/* 冒泡排序(3) i∈[0,N-1) //循环N-1遍 j∈[i+1, N) //每遍循环要处理的无序部分 swap(i,j) //两两排序(升序/降序)*/int bubble_sort_3(DataCompare cmp ,int arr[], size_t count){printf("bubble_sort_3:\n");size_t i, j;int temp;if(count < 2){return RET_OK;}for(i = 0; i < count-1; i++){for(j = i+1; j < count; j++){if(cmp(arr[i], arr[j]) > 0){ temp = arr[j];arr[j] = arr[i];arr[i] = temp;}}}return RET_OK;}/* 改进的冒泡排序 right∈[N-1, 0) //循环N-1遍 i∈[1, right) //每遍循环要处理的无序部分max = i; swap(max, right) //两两排序(升序/降序)*/int bubble_sort_4(DataCompare cmp ,int arr[], size_t count){printf("bubble_sort_4:\n");size_t i = 0;size_t max = 0;size_t right = 0;int temp;if(count < 2){return RET_OK;}for(right = count-1; right > 0; right --){for(i = 1, max = 0; i < right; i++){if(cmp(arr[i], arr[max]) > 0){max = i;}}if(cmp(arr[max], arr[right]) > 0){temp = arr[max];arr[max] = arr[right];arr[right] = temp;}}return RET_OK;}int bubble_sort(DataCompare cmp ,BubbleSort sort, int arr[], size_t count){#if DEBUGDEBUG_PRINT("%d", count);#endifreturn_val_if_fail(cmp != NULL && sort != NULL ,RET_FAIL);return sort(cmp, arr, count);}
test.c
/*Author : tandesirTime : 2012-08-21借鉴Li XianJing部分代码, 感谢 Li XianJing <xianjimli@hotmail.com>欢迎访问 http://blog.csdn.net/tandesir*/#include <stdio.h>#include <assert.h>#include "bubble_sort.h"#define DEBUG 0int main(int arc, char* const argv[]){size_t i = 0, n = 0;int arr1[] = {5, 4, 1, 3, 6};int arr2[] = {5, 4, 1, 3, 6, 10, 9, 8, 7, 2, 2};int arr3[] = {5, 4, 1, 3, 6, 10, 2, 8, 7, 2, 7};int arr4[] = {6, 1, 2, 3, 3, 10, 2, 9, 8, 2, 7};//-1-n = LENGTH(arr1);#if DEBUGDEBUG_PRINT("%d", n);#endifbubble_sort(cmp_int, bubble_sort_1 ,arr1, n);for(i = 0; i < n; i++)printf("%4d", arr1[i]);printf("\n");//-2-n = LENGTH(arr2);#if DEBUGDEBUG_PRINT("%d", n);#endifbubble_sort(cmp_int_invert, bubble_sort_2 ,arr2, n);for(i = 0; i < n; i++)printf("%4d", arr2[i]);printf("\n");//-3-n = LENGTH(arr3);#if DEBUGDEBUG_PRINT("%d", n);#endifbubble_sort(cmp_int, bubble_sort_3 ,arr3, n);for(i = 0; i < n; i++)printf("%4d", arr3[i]);printf("\n");//-4-n = LENGTH(arr4);#if DEBUGDEBUG_PRINT("%d", n);#endifbubble_sort(cmp_int_invert, bubble_sort_4 ,arr4, n);for(i = 0; i < n; i++)printf("%4d", arr4[i]);printf("\n");return 0;}
Makefile
src = test.c bubble_sort.ctarget = testtemp = $(wildcard *~)all:$(src)gcc -g $^ -o $(target)clean:rm $(temp) $(target)
*此版本代码只可对整形数据进行排序,欢迎编写通用版本代码。
【运行结果】
bubble_sort_1: 1 3 4 5 6bubble_sort_2: 10 9 8 7 6 5 4 3 2 2 1bubble_sort_3: 1 2 2 3 4 5 6 7 7 8 10bubble_sort_4: 10 9 8 7 6 3 3 2 2 2 1
转载请标明出处,仅供学习交流,勿用于商业目的
Copyright @ http://blog.csdn.net/tandesir
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- STM32 BIT_BAND 位带别名区使用入门
- 【值得珍藏】2012 PHP热门资料64个+经典源码50个——下载目录
- 手把手教你把Vim改装成一个IDE编程环境(图文)
- 在线的SA 绘图工具-Mockups
- 使用XML Schema验证XML数据输入
- 冒泡排序
- nio/mina(一) nio基本通信
- hdu4119-Isabella's Message
- Firefox 自动化插件开发—binary xpcom组件从3.6对应升级到4.0以上
- 修改eclipse启动的Tomcat内存
- 嵌入式C编程基础
- .net 获取一周星期一
- 查看AIX主机上的设备
- Ajax跨域请求