十大排序之一——冒泡排序

十大排序是啥?

        在人们的刻板印象中,排序是个傻子都会的事……

         But注意,如果我让你说出排序过程并写在纸上呢?层次瞬间就不一样了,那如果我在为难你一下,你把排序过程写出代码并且适用所有数呢?这,就是我们的最终任务

商品排序
Description

某商场的仓库中有 n 件商品,每件商品的价格在 0~1000 之间(价格为 0 的商品为赠品)。现在商场经理要求将这 n 件商品按价格由低到高排序。请编程输出 n 件商品排序后的情况。


Input
第一行一个正整数 n,表示有 n 件商品,1≤n≤100000。

接下来的 n 行,每行一个整数,表示第 i 件商品的价格。


Output
n 行,每行输出一个整数。

Sample Input 1                                                       

5
1
8
1
2
2

Sample Output 1

1
1
2
2
8

我们要做这个题就要有一个一定的思路,而这个思路是什么,题目告诉了你答案

冒泡排序(Bubble Sort)

        啥是冒泡排序,用教科书的语言来说冒泡排序(Bubble Sort)就是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。

        说实话,我看不懂,但我大受震撼,那么我们就来慢慢分析这句话

第一句(最重要)

           ——它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。

        它重复地走访过要排序的数列,注意里面的一个敏感词汇"重复"说明循环在里面不可缺少,且非常重要。"走访"翻译一下就是要遍历数组,还是循环,而重复的遍历,就是循环嵌套。

        一次比较两个元素,其中比较要用的首先肯定是比较运算符,那如何判定,就一定是如果……那么……,也就是if语句

        如果他们的顺序错误就把他们交换过来,而这句主要说的还是if语句

        我们把它连起来,就是首先运用循环嵌套多次遍历整个数组,从第一个数开始,一次向后一个数比较,如果大于后数,那么与后一个交换在与下一个数比,如果不是就以后数再去与下一个数比,在第一轮从前向后的比较结束后,再通过外循环在从头开始,直至数组从小到大依次排好

第二句

          ——走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。

         本句主要说的是排序的结束所以排序的过程主要长这个样子

这还不直观?好吧,那么接下来我就详细的一步一步解释出来 

冒泡排序大解析

        首先,我们先给出一组数,就用刚刚那个幼儿园题吧

6193729

 

很好,第一步,先从第一个开始和后面比较

6

193729

比较结果是6比1大,那么6和1位置互换

1693729

然后6和9比较,显然9要比6大,那么遍历的重任就落到了9身上

1693729

以此类推,因为9>3 9>7 9>2,9=9那么9就到了倒数第二(程序还是按照以前那样进行只是我懒得打那么多字了)而重任又从倒数第二个9到了最后一个9,因为他们相等,而9后没数了所以结束第一轮循环,开始第二轮

1637299

以此类推,第二轮结束应还是这样的

1362799

第三轮

1326799

第四轮

1236799

第五轮,检测到所有前数都比后数小,说明排序完成最后输出

样例代码(自己写的不知道对不对)

#include<iostream>
using namespace std ;
int main( ) {
	int n,a,jige[1005];
    cin>>n;
    for(int i=0;i<n;i++){
    	cin>>jige[i];
    }
  	for(int i=0;i<n;i++){
    	for(int j=0;j<n-1;j++){
        	if(jige[j]>jige[j+1]){
            	a=jige[j];
            	jige[j]=jige[j+1];
              	jige[j+1]=a;
        	}
        }
    }
    for(int i=0;i<n;i++){
    	cout<<jige[i]<<endl;
    }
      
      
      
      
	return 0 ;
	}

ps:先输出你一共要输出多少字,可能有些数设的不严谨,但不影响运行,同时也是开头那道题的答案。

尾声

        冒泡排序说实话在十大排序法中是最好使好理解且实用的一种排序方法,而上面提到的题不只有一种办法,他其实是一个桶排序的例题,桶排序是什么?这就是我们下期的话题,这期就到这里了,如果喜欢的话请大家点赞收藏家关注,我会持续更新关于C++的各种科普,我们下期再见!

本文由stio工作室出品,请勿转载 ,有什么建议欢迎私信我的邮箱地址:jigehahaha@163.com 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
冒泡排序是一种简单的排序算法,它重复地遍历待排序的元素,比较相邻元素的大小,如果顺序错误就交换它们,直到没有需要交换的元素为止。下面是冒泡排序的C语言实现: ```c void bubbleSort(int arr[], int n) { for(int i = 0; i < n-1; i++) { int flag = 0; //是否冒泡 for(int j = 0; j < n-1; j++) { if(arr[j > arr[j+1]) { swap(&arr[j], &arr[j+1]); flag = 1; } } if(flag == 0) { //如果没有发生交换,说明数组已经有序,可以提前结束循环 break; } } } ``` 在这个实现中,冒泡排序函数`bubbleSort`接受一个整型数组`arr`和数组长度`n`作为参数。它使用两层循环来遍历数组,并通过比较相邻元素的大小来进行交换。内层循环每次将最大的元素冒泡到数组的末尾。外层循环控制了冒泡的轮数,每一轮都会将当前未排序的最大元素放在正确的位置上。如果在某一轮的冒泡过程中没有发生交换,说明数组已经有序,可以提前结束循环,从而提高算法的效率。 需要注意的是,上述代码中使用了一个`swap`函数来交换两个元素的值,你可以根据需要自行实现该函数。此外,为了减少冒泡排序的时间复杂度,可以在内层循环中添加一个标志位`flag`,用于标记是否发生了交换。如果某一轮的冒泡过程中没有发生交换,说明数组已经有序,可以提前结束循环。这样可以避免不必要的比较和交换操作,提高排序的效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值