排序的方法很多,但每种算法都有自己的特点。本文总结了排序算法,排序算法最坏情况循环n *n 次,所以时间复杂度为O(n^2),而且算法稳定,易懂是该算法的特点
冒泡排序:
冒泡排序易于理解和接收,它是通过随机给定一个数组,然后让下标i和j分别指向array[0]和array[1]。比较array[j]和array[j-1],如果array[j-1]>array[j],则互换并且j++。比较完一轮后i++。直到i <=n-1。
手动步骤:
eg:1 4 7 89 67 21
第一轮(i = 0):
1 4 7 89 67 21
j = 1, array[j-1]>array[j]不成立,不互换,j+1
1 4 7 89 67 21
j = 2,array[j-1]>array[j]不成立,不互换,j+1
1 4 7 89 67 21
j = 3,array[j-1]>array[j]不成立, 不互换,j+1
1 4 7 89 67 21
j = 4,array[j-1]>array[j]成立,互换,j+1
1 4 7 67 89 21
j = 5,array[j-1]>array[j]成立,互换,j+1
1 4 7 67 21 89
j = 6,j=n-i成立,i +1,j=1
第二轮(i = 1):
1 4 7 67 21 89
j = 1,array[j-1]>array[j]不成立,不交换,j+1
1 4 7 67 21 89
j = 2,array[j-1]>array[j]不成立,不交换,j+1
1 4 7 67 21 89
j = 3,array[j-1]>array[j]不成立,不交换,j+1
1 4 7 67 21 89
j = 4,array[j-1]>array[j]成立,交换,j+1
1 4 7 21 67 89
j = 5,j = n-i成立,i+1,j+1
第三轮(i = 5):
……….
第n-1轮(i = 6)。
冒泡排序程序代码:
验证代码(主函数):
冒泡程序的优化:
优化方案1:
上述冒泡程序并不是最简洁的,如果i还没循环到length-1时就排好序了,i并不会停止,会继续增加循环。所以,上述的冒泡算法可以更优化。
设置一个flag状态量。用来记录本轮循环中是否有交换,如果有交换则值为1,否则置为0.为1时i继续增加,如果为0,则跳出循环。优化后的程序如下:
优化方案2:
第一种优化方案相对于最基本的冒泡排序相比更为简洁,但是在这个方案的基础上可以再进一步改进。设置一个变量first_swap 用来存放每一轮中第一次交换内容的下标值j。下一轮循环中,j直接从下标first_swap开始查询。如果本轮中没有进行交换则排序完成。具体程序如下:
这两种优化时间复杂度还是O(n^2),但是循环次数减少了,达到了一定的优化效果,可以通过更改主函数程序中使用的冒泡程序,来比较同样多数据用不同方案时间所用的时间。可能值还不是最好的优化,还有待大家继续努力,写出更好的优化方案。