冒泡排序

来源:互联网 发布:常见量化交易算法 编辑:程序博客网 时间: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

 

 

原创粉丝点击