冒泡排序学习笔记

原理:

设有n个数字,初始状态n个数字随机排序,最终实现从小到大的顺序

1.每次比较时,同时比较两个相邻的元素,根据大小交换位置,实现左小右大。

2.一共需要比较n-1趟,随着比较的趟数递增,每一趟所需要比较的次数递减,如第i趟只需要比较n-1-i次(下面会深入分析比较过程)

3.每一趟走完之后,不需要再比较最后一位的数字(也就是2中提到的随着走的趟数递增,比较次数递减),因为每一趟会让(这一趟走过的数字中的)最大的数字位于(这一趟的)最右侧

优点:

1.简单

2.如果只允许交换相邻两个位置,冒泡排序交换的次数最少(因为每一趟都让该趟走过的最大的数字排在最右端不再改动)

缺点:

1.时间复杂度较高,O(N2),只适用于部分题目

例题:

光说不练不行,来道超级典型的例题试试,附上一道洛谷中的排序题,本题是一道非常典型的冒泡排序。


P1116 车厢重组

题目描述

在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转。一个车站的职工发现桥的长度最多能容纳两节车厢,如果将桥旋转180180度,则可以把相邻两节车厢的位置交换,用这种方法可以重新排列车厢的顺序。于是他就负责用这座桥将进站的车厢按车厢号从小到大排列。他退休后,火车站决定将这一工作自动化,其中一项重要的工作是编一个程序,输入初始的车厢顺序,计算最少用多少步就能将车厢排序。

输入格式

共两行。

第一行是车厢总数N(N≤10000)

第二行是N个不同的数表示初始的车厢顺序。

输出格式

一个整数,最少的旋转次数

输入输出样例

输入:
4
4 3 2 1
输出:
6

AC代码

 1 #include<iostream>
 2 #include<cstdio>//swap函数头文件 
 3 using namespace std;
 4 int main()
 5 {
 6     int N;//车厢总数 
 7     cin>>N;
 8     int length[N+1];//车厢长度 
 9     for(int i=1;i<=N;i++)
10     {
11         cin>>length[i];
12     }
13     int time=0;
14     for(int i=1;i<=N-1;i++)//一共走N-1趟 
15     {
16         for(int j=1;j<=N-i;j++)//每一趟都要遍历从第一个到第N-i个数 
17         {
18             if(length[j]>length[j+1])//第j个数和它后面的数字比较 
19             {
20                 swap(length[j],length[j+1]);
21                 time++;
22             }
23          } 
24     }
25     cout<<time<<endl;
26  } 

对了,我曾经见过一张神奇的动图,让我一秒钟就明白了冒泡排序的精髓,或许我的文字都没有这张动图更能让您理解冒泡排序的过程。

附上该GIF,希望正在看博客的你也能马上学会冒泡排序!(我猜没人会看,毕竟是我的学习笔记而已...)

 

 

 

posted @ 2020-10-17 00:09  _厨师沙拉  阅读(183)  评论(0)    收藏  举报