排序算法之冒泡排序c语言(一)

一.什么是冒泡排序

冒泡排序是(相邻比序法)是一种简单的交换类排序方法,它是通过对相邻的数据元素进行交换,逐步将待排序序列变成有序序列的过程。

二.算法思想
数组由“待排序部分”(前半部分)和“已排序部分”(后半部分)组成。在处理开始之前,“已排序部分”为空,“待排序部分”则是整个数组。
反复扫描待排序序列,在扫描过程顺次比较相邻的两个元素的大小,若与排序顺序相反就交换位置。
以升序排序为列:共有n个数据,那么就需要进行n-1趟排序。
在第一趟冒泡排序中,不断地将相邻两个数据,并将大的数字不断向后移动,最后,毕然最大的数据放在待排序的末尾,这时的数据便归属于已排序部分。(需比较n-1次)
然后进行第二趟排序:对前n-1个待排序进行与第一趟同样的操作,其结果是使次大的数据被放在n-1的位置上。这是便有2个数据在已排序部分。(需比较n-2次(n-1-1))
如此反复,每一趟排序都会将一个数据排到正确位置,直到剩下最小的数字。最终所有的都归属在“已排序部分”的时候,排序结束。

例子:19 80 77 11

  • 19 77 80 (交换) 11
  • 19 77 **11 80 **(交换)
    //第一趟排序结束,最大80被移到最后,比较了3次(19与80,是大到小,所以不交换,80与77,是逆序,交换,最后80与11,交换)
  • 19 11 77 80
    //第二趟排序结束,次大数77被排好,
  • 11 19 77 80
    //第三趟排序结束,第三大数19被排好,整个排列已有序
    以上4个数排序,共进行3趟。

三.代码


void BubbleSort(int *array,int n)
{
	int i,j;
	int t=0;
	for(j=0;j<n-1;j++)
	{
		for(i=0;i<n-j-1;i++)
		{
			if(array[i]>array[i+1])
			{
				t=array[i];
				array[i]=array[i+1];
				array[i+1]=t;
			}
		}
	}
	for(i=0;i<n;i++)
	{
		printf("%d ",array[i]);
	}
}

改进后:若在某一趟冒泡排序过程中,没有发现一个逆序(不需要交换),则可直接结束整个排序过程,因为此时说明序列已经有序了。这样便可以优化代码,提高代码运行效率。

#include<stdio.h>
void BubbleSort(int *array,int n)
{
	int i,j;
	int flag=1;
	int t=0;
	for(j=0;j<n-1;j++)
	{ flag=0;//记录该趟冒泡排序是否进行交换 
		for(i=0;i<n-j-1;i++)
		{
			if(array[i]>array[i+1])
			{  
				t=array[i];
				array[i]=array[i+1];
				array[i+1]=t;
				flag=1;
			}
			if(flag==0)
			break;
	
		}
	}
	for(i=0;i<n;i++)
	{
		printf("%d ",array[i]);
	}
}
int main()
{
	int a[5]={19,0,1,2,6};
	BubbleSort(a,5);
	return 0;
	 } 

运行结果:
在这里插入图片描述

时间复杂度:O(N^2), 空间复杂度:0(1);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值