【说明】参考维基百科描述,重新编写了冒泡排序。源码已更新于维基百科(维基百科冒泡排序3.2部分)。此处提供源码,详细描述可参考维基百科冒泡排序,欢迎完善新版本。
【代码清单】
typedef.h
/*
Author : tandesir
Time : 2012-08-21
借鉴Li XianJing部分代码, 感谢 Li XianJing <xianjimli@hotmail.com>
欢迎访问 http://blog.youkuaiyun.com/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 : tandesir
Time : 2012-08-21
借鉴Li XianJing部分代码, 感谢 Li XianJing <xianjimli@hotmail.com>
欢迎访问 http://blog.youkuaiyun.com/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 : tandesir
Time : 2012-08-21
借鉴Li XianJing部分代码, 感谢 Li XianJing <xianjimli@hotmail.com>
欢迎访问 http://blog.youkuaiyun.com/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 DEBUG
DEBUG_PRINT("%d", count);
#endif
return_val_if_fail(cmp != NULL && sort != NULL ,RET_FAIL);
return sort(cmp, arr, count);
}
test.c
/*
Author : tandesir
Time : 2012-08-21
借鉴Li XianJing部分代码, 感谢 Li XianJing <xianjimli@hotmail.com>
欢迎访问 http://blog.youkuaiyun.com/tandesir
*/
#include <stdio.h>
#include <assert.h>
#include "bubble_sort.h"
#define DEBUG 0
int 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 DEBUG
DEBUG_PRINT("%d", n);
#endif
bubble_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 DEBUG
DEBUG_PRINT("%d", n);
#endif
bubble_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 DEBUG
DEBUG_PRINT("%d", n);
#endif
bubble_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 DEBUG
DEBUG_PRINT("%d", n);
#endif
bubble_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.c
target = test
temp = $(wildcard *~)
all:$(src)
gcc -g $^ -o $(target)
clean:
rm $(temp) $(target)
*此版本代码只可对整形数据进行排序,欢迎编写通用版本代码。
【运行结果】
bubble_sort_1:
1 3 4 5 6
bubble_sort_2:
10 9 8 7 6 5 4 3 2 2 1
bubble_sort_3:
1 2 2 3 4 5 6 7 7 8 10
bubble_sort_4:
10 9 8 7 6 3 3 2 2 2 1
转载请标明出处,仅供学习交流,勿用于商业目的
Copyright @ http://blog.youkuaiyun.com/tandesir