1. 冒泡排序是一种非常容易理解的排序算法。冒泡排序的原理是:从左到右,相邻元素进行比较,每次比较一轮,就会找到序列中的最值,这个数就会从序列的最右边冒出来。
举个栗子:
对下面这个序列进行从小到大的排序【10,7,5,27,98,31】
第一轮:
1)10和7相比较,10>7,则它们互换位置:【7,10,5,27,98,31】
2)10和5相比较,10>5,则它们互换位置:【7,5,10,27,98,31】
3)10和27相比较,10<27,则它们不换位置:【7,5,10,27,98,31】
4)27和98相比较,27<98,则它们不换位置:【7,5,10,27,98,31】
5)98和31相比较,98>31,则它们互换位置:【7,5,10,27,31,98】
到此第一轮结束,本次的结果是找到了序列中最大的值,并浮到了中最右边
比较时,每轮的第n次比较是新序列中第n个元素和第n+1个元素比较
第二轮:开始时【7,5,10,27,31,98】
1)7和5相比较,7>5,则它们互换位置:【5,7,10,27,31,98】
2)7和10相比较,7<10,则它们不换位置:【5,7,10,27,31,98】
3)10和27相比较,10<27,则它们不换位置:【5,7,10,27,31,98】
4)27和31相比较,27<31,则它们不换位置:【5,7,10,27,31,98】
第三轮:开始时【5,7,10,27,31,98】
1)5和7相比较,5<7,则它们不换位置:【5,7,10,27,31,98】
2)7和10相比较,7<10,则它们不换位置:【5,7,10,27,31,98】
3)10和27相比较,10<27,则它们不换位置:【5,7,10,27,31,98】
第四轮:开始时【5,7,10,27,31,98】
1)5和7相比较,5<7,则它们不换位置:【5,7,10,27,31,98】
2)7和10相比较,7<10,则它们不换位置:【5,7,10,27,31,98】
第五轮:开始时【5,7,10,27,31,98】
1)5和7相比较,5<7,则它们不换位置:【5,7,10,27,31,98】
至此,整个序列排序结束,从上面过程可以看出,冒泡排序比较的轮数是数组长度-1,每轮比较的对数等于数组的长度 - 当前轮数。
清楚冒泡排序实现的原理后,接下来我们上实现代码!
运行结果:
2.插入排序是冒泡排序的优化,是一种直观的简单排序算法。它的实现原理是通过构建有序数组元素的存储,对未排序的数组元素,在已经排序的数组中从最后一个元素向第一个元素遍历,找到相应位置并插入。其中,未排序数组的第1个元素会被看作是一个有序的数组,从第二个到最后一个元素会被看作是一个无序数组。
举个栗子:
对下面这个序列进行从小到大的排序 [3,1,2,5,4]
首先,将未排序的第一个元素【3】保持不动,看作一个有序的数组,
再看第二个元素【1】,和前面的元素【3】相比,1<3,所以我们将1,3相互交换位置,得到【1,3,2,5,4】
再看第三个元素【2】,2<3,所以彼此交换位置,又发现2>1,所以2应该插入1和3之间,得到【1,2,3,5,4】;
再看第四个元素【5】,5>3 , 所以它们之间不需要交换,得到【1,2,3,5,4】;最后是元素【4】,4<5,所以4和5要交换位置,又4>3,所以4最终要在3和5之间,得到【1,2,3,4,5】
至此,插入排序结束。
知道原理之后,我们再来看实现代码:
运行结果:
(ps :本菜鸟玻璃心,接受不了负面评论,写的不好别骂我,骂就是你对)