BubbleSort冒泡排序算法 C语言

3 篇文章 0 订阅
3 篇文章 0 订阅

基本概念:
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
它重复地走访过要排序的元素列,依次比较两个相邻的元素,
如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。
走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素已经排序完成。
这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),
就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

算法原理:
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。
在这一点,最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了第一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

 

示范代码:

#include <stdio.h>
#define SIZE 8
 
void bubble_sort(int a[], int n);
 
void bubble_sort(int a[], int n)
{
    int i, j, temp;
    for (j = 0; j < n - 1; j++)
        for (i = 0; i < n - 1 - j; i++)
        {
            if(a[i] > a[i + 1])
            {
                temp = a[i];
                a[i] = a[i + 1];
                a[i + 1] = temp;
            }
        }
}
int main()
{
    int number[SIZE] = {95, 45, 15, 78, 84, 51, 24, 12};
    int i;
    bubble_sort(number, SIZE);
    for (i = 0; i < SIZE; i++)
    {
        printf("%d\n", number[i]);
    }
    return 0;
}
另一种可以参考的做法是(在此只给出关键实现部分,其余部分请读者自行实现),另外请注意item类型。
void refore(item *a,int index1,int index2)
{
    item temp_data = a[index2];
    a[index2] = a[index1];
    a[index1] = temp_data;
    return;
}
void bsort(item *a,int index_top)
{
    int out_count = 0;
    while(out_count != (index_top+1)*(index_top+1)){
        int this_index = 0;
        while(this_index <= index_top){
            if(a[this_index] > a[this_index + 1])
                refore(a,this_index,this_index + 1);
            this_index++;
        }
        out_count++;
    }
}

 

个人理解与思路:
实现冒泡排序,是需要两个相邻元素进行比较,依次类推往下比较,直到最后一组的相邻两个元素
比较完毕即可。打个比方,现在有4个数字要进行比较,那么我们一次就要进行3轮比较,我们可以
知道这个比较的轮数为数组元素数减去1,即数组元素数(arr)- 1 = 比较的轮数(len)。
也就是我们需要定义一个循环来控制这个比较的轮数。
元素之间的比较是要从下标为0开始的数与下标为1开始的数进行比较的,所以我们需要声明一个变量i,
然后从下标0开始循环比较,依次类推到最后一个元素,这个元素的下标是数组元素个数减1。但是这个
比较循环必须是包含在轮数循环中的,可以说是一个循环之间的嵌套。
然后就是进行比较了,比较第一个和第二个下标处的值的大小,如果1比2大,这里可以声明一个临时
变量,用于储存第一个值,这时第一个值就是NULL空值,然后将第二个下标处的值给第一个下标处,
再把临时存储的变量赋值给第二个下标处。

 

C代码:

#include <stdlib.h>
 
/*实现冒泡排序算法的bubble函数*/ 
/*传递参数arr数组,并传参数组中的元素个数len*/ 
void bubble(int arr[], int len) {
	/*声明变量i和j,首先要使用外层循环控制轮数*/
	int i = 0, j = 0;
	for (i=1; i < len; i++)  {
		/*内层循环用于比较下标元素之间的大小*/
		for (j=0; j < len - 1; j++) {
			/*如果说第一个下标数
			  比第二个下标数要大*/
			if (arr[j] > arr[j+1]) {
				int temp = arr[j];	//临时声明一个temp变量来保存j下标处的值 
				arr[j] = arr[j+1];	//将j+1下标处的值赋给j下标处 
				arr[j+1] = temp;	//然后将temp临时变量储存的值赋给j+1下标处 
			}
		}
	}
} 

/*主函数*/
int main() {
	/*声明数组变量*/ 
	int arr[9] = {20, 33, 67, 91, 1, 59, 42, 25, 28, 96};
	/*被调用函数bubble声明*/ 
	bubble(arr, 9);
	/*声明一个循环打印的变量*/
	int i = 0;
	/*用开始从第一个数字打印,因为数组中有10个数,所以i不能大于9*/
	for (i=0;i<9;i++) {
		printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}

运行结果:

1 20 25 28 33 42 59 67 91

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值