'''
1.排序算法: 也即是把一串无序的数据,依照特定的顺序进行排列的算法.实现从无序到有序的算法
2.稳定性: 将如下一组元组,按元组中第一个元素大小进行排序进行: (4, 1) (3, 1) (3, 7) (5, 6)
在这种情况下有可能产生两种结果:
(1) (3, 1) (3, 7) (4, 1) (5, 6)
(2) (3, 7) (3, 1) (4, 1) (5, 6)
第(1)种保持了原来(3, 1) (3, 7)的前后顺序,这种我们称为稳定的.
第(2)种改变了原有数据这俩元组的前后顺序,我们称这是不稳定的.
也即若是一种排序能够保证,相等的对比元素,在排序后仍能够保持原有前后顺序的话,那我们就称这种排序算法为稳定的.
例如此处(3, 1)与(3, 7)中的对比元素都为3,因此实现这两个元组的前后顺序,在排序后不发生改变的第(1)组算法为稳定排序算法.
3.双层for循环: 注意了这是你的一个思维误区,在双层for循环的情况下,第二个for循环也属于一个独立的for循环,程序会把第二个for循环执行一次从 0-n
后才执行一次第一个for循环,这也是为什么双层for循环的时间复杂度为 n*n 的原因.
以后你遇到双层for循环时,就在脑子里执行一次从 0-n 的第二个for循环.
'''
'''
所谓冒泡排序,也即是一个元素一个元素的比较大小,最终实现最大的那个元素排在了末尾.这玩意你应该不需要记笔记,因为只要领悟一遍基本上就能记住.
'''
def bubble_sort(alist):
n = len(alist)
for j in range(n-1): # 第一个for循环是为了避免重复的从头比到尾,因为经过排序后最后一个数一定是最大的,所以没必要再与最后一个数进行对比.
count = 0 # 这里创建count能够简化程序的时间复杂度,当原数据已是按规则顺序排序时,可以直接退出,避免无用的再次排序.如[1,2,3,4],这就是一组规则的数据,无需在按大小顺序重新排序.
for i in range(0, n-1-j): # 第二个for循环是实现元素移动,与对比交换位置的.
if alist[i] > alist[i+1]: # 注意了没必要去理会当 alist[i+1]>alist[i] 的情况,因为你若是自己推的话能发现,这个循环神奇的就把这种情况给避免了
alist[i], alist[i+1] = alist[i+1], alist[i]
count += 1
if count == 0: # 注意了这里有一个误区,这个if条件是写在第二个for循环后的,因此只有当第二个for循环,循环一次从0到(n-1-j)次之后,
return # 才会进行count值的判断,也即他是不会出现[1, 2, 4, 3]这种前部分是按顺序,后半部分不按顺序也会退出的情况的.到底为什么,还需要你深刻的理解什么是二重for循环.
if __name__ == '__main__':
# li = [54, 26, 93, 17, 77, 31, 44, 55, 20]
li = [1, 2, 3, 5, 4]
print(li)
bubble_sort(li)
print(li)