冒泡排序

【说明】参考维基百科描述,重新编写了冒泡排序。源码已更新于维基百科(维基百科冒泡排序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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值