冒泡排序:
是一种计算机科学领域的较简单的排序算法。名字由来是因为越大的元素会经典交换慢慢“浮”到数列的顶端,故名。(指从大到小的排序)——某百科的解释
算法原理:
对一个给定长度为n的随机无序数组a[],以从小到大排序为例。
- 从第1位开始,相邻的2个数字两两互相比大小,如果前者比后者大,则双方交换数值。然后值大者再与后一位比较……通过相邻的数字不断两两比较(后者大则双方交换数值),值大者的下标将一步一步向后移动。
- 第一轮循环:数组所有值按步骤1中的方式比对,最终数组中的最大值移动到最末位(a[n-1],数组下标从0开始)。
- 第二轮循环:数组前n-1位(a[0]至a[n-2])按步骤1中的方式比对,最终前n-1位中的最大值移动到倒数第2位(a[n-2])。
- 第三轮循环:数组前n-2位(a[0]至a[n-3])按步骤1中的方式比对,最终前n-2位中的最大值移动到倒数第3位(a[n-3])。
- ……
- 第 x 轮循环:数组前n-x+1位(a[0]至a[n-x])按步骤1中的方式比对,最终前n-x+1位中的最大值移动到倒数第x位(a[n-x])。(x<=n-1)
- ……
- 第n-1轮循环:数组前2位(a[0]至a[1])按步骤1中的方式比对,最终前2位中的最大值移动到第2位(下标1)。此时全部排序完成。
图解过程
算法原理虽然比较简单,但仅通过文字阅读比较空洞和模糊,接下来以图解一个简单数组冒泡排序的过程来进行说明,会形象一些。建议看懂图解后再看后面的代码。
以对给定的无序数组进行从小到大排序为例。
图解说明
从图解过程可以看出,我们对长度为5的数组进行了4次循环,分别用来确定末位a[4]、倒数第二位a[3]、a[2]、正数第二位a[1]位的值(思考:为什么第一位a[0]的值不用通过再一次循环来确定?)。
因此我们猜想对于长度为n的数组,需要n-1次循环来从末向前依次确定每次的最大值(即依次确定a[n-1]/a[n-2]/……/a[2]/a[1]的值)。
用 int类型 i 来表示第几次循环的话,则 i 取值为1至n-1间&#x