算法--冒泡排序
算法关键点:
无序区
有序区
冒泡排序
列表每两个相邻的数,如果前边的比后边的大,那么交换这两个数……(升序,大的放后面)
代码关键点:
- 趟
- 无序区 (红色表示有序去,白色表示无序区)
python代码实现:
li = [9, 2, 3, 4, 5, 6, 7, 8, 1] def foo(li): for i in range(len(li) - 1): # 列表长度-1 趟; i 表示第几趟 for j in range(len(li) - i - 1): # 无序区的长度 -1; j 表示当前索引,要和后面的j+1索引比较 if li[j] > li[j + 1]: li[j], li[j + 1] = li[j + 1], li[j] foo(li) print(li) # [1, 2, 3, 4, 5, 6, 7, 8, 9]
时间复杂度:O(n2)
优化:如果冒泡排序中执行一趟而没有交换,则列表已经是有序状态,可以直接结束算法。
def foo(li): for i in range(len(li) - 1): exchange = False for j in range(len(li) - i - 1): if li[j] > li[j + 1]: # 循环一遍,前面的值都小于后面,说明已经排好了,就执行下面的return li[j], li[j + 1] = li[j + 1], li[j] exchange = True if not exchange: return
Python的速度 10的7次方 (千万)
C语言大约是Python的10倍
100002次运算次数 Python用时10秒左右, C用1秒左右