一个典列来带领大家了解冒泡排序思想

一个典列来带领大家了解冒泡排序思想!!

对于排序,大家在将来将会了解到更多的排序:

  1. 插入排序  ▪ 冒泡排序
  2. 快速排序
  3. 归并排序

上面是笔者在百度百科中搜索到的,感兴趣的读者,请点击一下,进行参考!! 另:百度百科主页为:排序算法_百度百科  希望读者进行简单了解一下!

话不多说,对于很多的排序方法,不知道又能熟练运用几个!!只有熟练掌握了,才能更完美的使用!因此,贪多嚼不烂,所以,就需要大家多多练习!

冒泡排序算法的原理如下: [1]   

原文链接为:冒泡排序_百度百科

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 [1] 

  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 [1] 

  3. 针对所有的元素重复以上的步骤,除了最后一个。 [1] 

  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 [1] 

    上面的思想就是冒泡排序的精华所在!对于此,我们可以定义一个数组,比如:对一个整型数组进行排序,将乱序排为升序!整型数组为:arr[]={2,1,3,7,5,9,6,8,0,4};  排序后的升序为:arr[]={0,1,2,3,4,5,6,7,8,9};

    下面请看笔者思路:

    通过上面的代码,我们可以看出来,一趟冒泡排序确定一个数!因此有n个数,我们就需要进行n-1趟冒泡排序(最后一趟就没有必要进行,因为在最后一趟时候,就已经没有需要比较的数字了!!所以,可以进行n-1趟冒泡排序!

    但是对于冒泡排序看着虽然很简单,其实写起来,只要注意一下那几个简短的代码,其他的也就没有什么难度,但是,冒泡排序有一个缺陷:只能进行一种类型的排序,不能排列多种类型!!!若有想法者:请参考:qsort(C语言标准库提供的排序函数)可以实现对多种数组:(浮点型,字符型,……)实现排序!!但思想是按照快速排序的想法而来,在此,笔者就不做过多的关于sqort函数的讲述!!

    言归正传!下面我们来回到冒泡排序的代码上面!下面请欣赏笔者的对于用整型数组实现冒泡排序!!

     
    #include <stdio.h>
    
    void bubble_sort(int arr[], int sz)
    {//缺陷:int arr[]  只能排序整型数组
    	int i = 0;
    	for (i = 0; i < sz - 1; i++)//趟数
    	{
    		int j = 0;
    		for (j = 0; j < sz - 1 - i; j++)//一趟冒泡排序的过程!
    		{
    			if (arr[j] > arr[j + 1])
    			{
    				int tmp = arr[j];
    				arr[j] = arr[j + 1];
    				arr[j + 1] = tmp;
    			}
    		}
    	}
    }
    
    void print(int arr[], int sz)
    {
    	int i = 0;
    	for (i = 0; i < sz; i++)
    	{
    		printf("%d ", arr[i]);
    	}
    	printf("\n");
    }
    
    int main()
    {
    	//冒泡排序
    	//对整型数组进行排序——排序为升序!
    	int arr[] = { 2,1,3,7,5,9,6,8,0,4 };
    	//乱序的整型数组!
    	int sz = sizeof(arr) / sizeof(arr[0]);//计算出数组有几个元素
    	bubble_sort(arr, sz);
    	print(arr, sz);
    	return 0;
    }

     在上述代码中,我们需要着重注意的部分就是在于bubble_sort函数部分:下面笔者就这一部分代码进行简单讲解:

    void bubble_sort(int arr[], int sz)
    {//缺陷:int arr[]  只能排序整型数组
    	int i = 0;
    	for (i = 0; i < sz - 1; i++)//趟数
    	{
    		int j = 0;
    		for (j = 0; j < sz - 1 - i; j++)//一趟冒泡排序的过程!
    		{
    			if (arr[j] > arr[j + 1])
    			{
    				int tmp = arr[j];
    				arr[j] = arr[j + 1];
    				arr[j + 1] = tmp;
    			}
    		}
    	}
    }

    首先:1.对于n个数字,我们需要进行n-1趟冒泡排序,毕竟最后一趟冒泡排序,因为没有数字比较,所以也就不用进行了!!2.每次的冒泡排序都会有一个沉底的部分,这个沉底的就是确定下来的值!不用再参与比较大小,所以每次都会进行-1运算,但是随着趟数 i 的增加,细心的你,不知道是否能够发现趟数 i  与每次冒泡排序执行 j 过程之间的关系呢???每次比较的都是arr[j]与arr[j+1],而且这样写,也不用害拍数组越界!毕竟第一次时候,j=sz-1-0=sz-1,所以此时的arr[j+1]恰好指向最后一个元素!!

  5. 代码的运行结果为:

  6.  当然,对于数组arr[]读者也可以进行键盘输入,这个可以实现对多组数组进行排序,但是笔者在此就不做过多的更改,因为,太简单了!!!

对于该冒泡排序的思想,笔者已将用代码来进行讲解完毕,如果读者有不同的意见或者想法,请及时对笔者进行私聊哦!!!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

念君思宁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值