冒泡排序

冒泡排序

  • 问题描述: 给定一个长度为n一维数组An,对其进行顺序排序后输出所有元素。

  • tip: 所举样例默认为升序,冒泡排序有两种遍历方式:从前往后遍历和从后往前遍历; 这里采用从后往前排,后续解释了两种遍历方式的差异。

  • 排序讲解: 最慢需要进行n-1次排序。每一次排序时,将相邻两项元素进行对比,较小的元素排前面;当某次排序没有发生位置交换时,则表示排序结束。

  • 过程分析:

    • 在第i次排序时,依次从An-1 开始向前进行遍历,直到遍历到**Ai**时, 结束该次遍历。
    • 每次遍历中,如果Ak<Ak-1 成立时,则交换二者位置,实现较小的元素位置靠前,较大元素位置靠后。然后继续向前进行遍历;
    • 进行n次排序,第i次排序中对比的元素序列为:An-1到Ai;每次遍历过程中实现当前对比序列中的最小值放置于当前序列队首,既第i次排序结束后,Ai一定为位置i以后的最小元素。
    • 经过第i次排序后,A0到Ai序列一定满足升序,因为越早找出的元素,其值就越小; 在每次元素对比中,同时也实现了较大元素位置靠后。
    • 从后往前进行遍历的重点在于: 每次遍历都能找到一个当前序列的较小值放置于当前序列最前方;当出现某一次遍历中不存在位置更替,则后续元素都满足升序。
    • 如果想要从前往后遍历: 每次遍历的序列为A0到An - i - 1,找出当前序列中的较大值放置于当前序列最后,当不存在位置更替时,则前列元素也满足升序。
  • 时间复杂度:O(n^2)

// 升序
// 从后往前进行遍历
void BubbleSort1(int [] arr,int n){
   int temp;//临时变量
   bool flag;//是否交换的标志
   for(int i=0; i < n-1; i++){   //表示趟数,一共 l-1 
       // 每次遍历标志位都要先置为false,才能判断后面的元素是否发生了交换
       flag = false;
       for(int j = n - 1; j > i; j--){ //选出该趟排序的最大值往后移动
           if(arr[j] < arr[j-1]){//排序方向
               temp = arr[j];
               arr[j] = arr[j-1];
               arr[j-1] = temp;
               flag = true;    //只要有发生了交换,flag就置为true
           }
       }
       // 判断标志位是否为false,如果为false,说明后面的元素已经有序,就直接return
       if(!flag) return;
   }
}

// 从前往后进行遍历
void BubbleSort1(int [] arr,int n){
   int temp;//临时变量
   bool flag;//是否交换的标志
   for (j = 0; j < n - 1; j++)
	{
		flag = false;
		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;
				flag = 1;//不是有序的,flags设置为1;
			}
		if (!flag) return;
	}
}

视屏过程讲解:(转载网上视屏,如果有侵权麻烦大佬私信我,立马解决!!!)
https://haokan.baidu.com/v?pd=wisenatural&vid=2462905062091788627

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值