也许你第一眼看到这篇博客会说,我不是来排序算法的吗,一言不合来首诗是几个意思啊?你看到这大可以放心,这一定是一个排序算法的讲解博客。
写诗的目的就是笔者先装个(你懂的)
这首诗其实自有深意,且容我娓娓道来。。。
排序十式是讲解了十个简单的常用算法:**冒泡排序,插入排序,希尔排序,选择排序,桶排序,快速排序,归并排序,堆排序,基数排序,计数排序。**本文将着重谈论冒泡排序。
大家应该上中小学的时候按大小个换过座位吧(但愿都有这个经历)/换座位的时候,老师让所有同学,在教室外面站成一列,然后让同学们自行按身高调整至最终状态,即列首至列尾从高到低排列,同学们和相邻的同学比高低,“矮子,到我后边去”,“长得高,山大无柴烧”,同学们和平的比较身高并且不断调整顺序,就能达到老师要求的最终状态。比如
这是刁家三兄弟,这三个人大家以后会经常见到。他们需要通过在队伍里自我和相邻的人比较调整,使得队伍变成由高到低的次序,既然第一个人左边没有人,右边有人,而最后一个人右边没人,只有左边有人,那么实际上就可以把和相邻两人的比较,改为当前的人和后面一个人比较,在图中给即中刁和小刁比,小刁和大刁比,大刁和空气比 大刁没人比了,那么就算第一轮调整结束,那么让我们来观察他们是如何调整的。
第一个人和第二个人比较,即小刁和中刁比较,小刁高,所以小刁和中刁交换位置,小刁变成了队伍的第二个人,然后第二个人和第三个比,即小刁和大刁比,小刁矮,故小刁和大刁交换位置,结果如下图所示:
注意这个时候第三个人变成了小刁,第三个人后面没有人,故第一轮比较就结束了。这个时候细心的人会发现(如果没有发现请不要忧伤,亡羊补牢,为时未晚)最矮的小刁从第一个人变成了最后一个人,对!冒泡排序每一轮比较完成都会让当前未归位的人中最矮的人归位(在这里就是跑到队尾)。每一轮有一个人归位,那么n个人一个需要几轮才能让所有人归位呢?
n轮?。。。。。。。。。。。。。其实是n-1轮,因为当n-1个人归位了,就只剩一个人,也就没必要再调整了。冒泡的原理就是:每次比较相邻的两个元素,如果他们顺序错误就把他们交换过来。
为什么不直接让最高的站到队首去,第二高的站在第二个位置,以此类推呢?因为他们是队伍内部比较排序,“不知庐山真面目,只缘身在此山中”也就是形容他们的。接下来再看个从小到达冒泡排序的示意图,相信看过之后能很好地理解冒泡的原理:
冒泡排序的核心是两层嵌套循环,其时间复杂度是O(N²),对于搞算法的人这么高的复杂度实在是惨不忍睹,但他确实是排序基础,后面也会介绍更优的内部比较算法(冒泡算法有太多重复的比较)。看到这里~~,相信你应该也明白冒泡排序怎么用代码实现了吧~~ ,接下来看看冒泡排序的代码长什么样吧。
c++实现
#include<bits/stdc++.h>//c++万能库
using namespace std;
int main()
{
int a[105];
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n-1;i++)//n个数只需要比较n-1轮
{
for(int j=1;j<=n-i;j++)//每一轮结束,都有一个数字归位,到数组末尾,所以是j<=n-i
{
if(a[j]<a[j+1])//比较大小,如果顺序错误则交换
{
int t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
//输出结果
for(int i=1;i<=n;i++)
printf("%d%c",a[i],i==n?'
':' ');
return 0;
}
鄙人写这些基础的排序算法,实际是为了增强语言表达能力(闲得胃疼),还有就是温习一下算法思想。。。