经典排序算法总结与实现
本篇博客所有排序实现均默认从小到大。
一、冒泡排序BubbleSort
介绍:
冒泡排序的原理非常简单,它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。
步骤:
- 比较相邻的元素,如果第一个比第二个大,就交换他们两个;
- 对第0个到第n-1个数据做同样的工作。这时,最大的数就“浮”到了数组最后的位置上;
- 针对所有的元素重复以上的步骤,除了最后一个;
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较;
Python源代码(错误版本):
def bubble_sort(arry):
n = len(arry) #获得数组的长度
for i in range(n):
for j in range(i+1, n):
if arry[i] > arry[j] : #如果前者比后者大
arry[i],arry[j] = arry[j],arry[i] #则交换两者
return arry
注:上述代码是没有问题的,但是实现却不是冒泡排序,而是选择排序(原理见选择排序),注意冒泡排序的本质是“相邻元素”的顺序交换,而非每次完成一个最小数字的选定。
Python源代码(正确版本):
def bubble_sort(arry):
n = len(arry) #获得数组的长度
for i in range(n):
for j in range(1, n-i): # 每轮找到最大数值 或者用 for j in range(i+1, n)
if arry[j-1] > arry[j] : #如果前者比后者大
arry[j-1],arry[j] = arry[j], arry[j-1] #则交换两者
return arry
不过针对上述代码还有两种优化方案。
优化1:
某一趟遍历如果没有数据交换,则说明已经排好序了,因此不用再进行迭代了。用一个标记记录这个状态即可。
Python源代码: