冒泡排序学习笔记
原理:
设有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,希望正在看博客的你也能马上学会冒泡排序!(我猜没人会看,毕竟是我的学习笔记而已...)


浙公网安备 33010602011771号