冒泡排序详解

​​​​​​​一.问题分析

  冒泡排序是一种直观的排序算法,重复走过要排序的数列,一次比较两个元素,如果顺序不对,就把他们交换过来,一直重复这个过程直到排序完成。

例如这个数组如果我们想要用冒泡排序完成升序排列,那么他的过程是怎么样的呢

首先当然是第一个元素2与它相邻的9进行比较,发现2<9,符合升序要求,再与9相邻的4进行比较,仍然满足升序,直到和1比较后,不满足升序,则此时2与1互换位置则此时数列变为

我们将这个过程为一趟冒泡排序

然后进行进一步比较,从9开始与它相邻的元素比较,重复1的操作,我i们发现9首先和4互换位置,再和7互换位置,再与5互换位置,再与8互换位置。最后与2互换位置。此时数列变为

此时我们对于9和2的排序完成了,后面的5个元素的操作同上,最终就完成了整个数组的排序。

二.解题思路

对于这个代码的编写,我们从宏观上先去思考一下,完成整个数组的排序需要多少趟排序呢,不难看出若数组中共K个元素则需要k-1次冒泡排序。那我们完全可以用一个for循环解决这个过程,

int i=0;
scanf("%d",&i);
int k=0;
for (k=0;k<i-1;k++)
{
//里面是程序进一步过程

}

我们以经完成了数组中所有元素的冒泡排序时的趟数,那么一个元素再排列时具体又是怎么样的呢

,我们假设m是数列中间的一个元素,那么此时他的前面一定是比它小的元素顺序已经排好,它只需要和它后面的k-m个元素进行排列就好了。从这个例子看,每一个元素排列时总是与他们之前的元素个数,及数组的元素个数有关,所以我们首先想到嵌套一个for循环,来解决这个问题

int i=0;
scanf("%d",&i);
int k=0;
for (k=0;k<i-1;k++)
{
  int j=0;
  for(j=0;j<i-1-k,j++)
  {
   //条件判断
  }

}

那么就剩下如果不满足升序的条件时元素的交换了,这个很简单,一个if条件判段,创建一个第三变量来交换元素

if(arr[j]>arr[j+1])
{
  int tem=arr[j];
  arrf[j]=arr[j+1];
  arr[j+1]=tem;
}

ok,那么我们就完成了整个冒泡排序的过程。

三.代码实现

运行截图:

代码源码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void bubble_sort(int arr[], int sz)
{
	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 tem = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tem;
			}
		}
	}
}
void print_arr(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}
int main()
{
	int arr[] = {1,4,7,5,8,9,2};
	int sz = sizeof(arr) / sizeof(arr[0]);//计算了整个数组的元素的个数
	bubble_sort(arr, sz);//冒泡排序的函数
	print_arr(arr, sz);//打印数组元素
	return 0;
}

完成排序!!!

四.总结与思考

冒泡排序是最简单的算法之一,再我们要对一个数列中的元素进行排列的时候,非常有用,对于初学者来说是一种必须掌握的技能,再熟悉了整个过程之后,可以思考一下,这个代码有没有可以优化的地方呢?对了如果序列以经有序,再进行排序则没有意义,此时我们可有创建一个变量flag,再一趟冒泡排序之后,如果flag没有发生改变,则证明数列已经有序,直接break跳出循环即可。

但是冒泡排序还是有一些弊端的,比如它无法对进行不同数据类型的数进行排列。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值