我要以最简洁的方式,走到对岸~ def numbers(numbers): start_time = time.clock() for i in range(len(numbers)-1): for j in range(len(numbers)-1-i): if numbers[j] < numbers[j+1]: numbers[j],numbers[j+1] = numbers[j+1],numbers[j]
实现有很多中方法,我们选择一种最不占用内存的方法这才是算法的点睛之笔。
两个for循环,第一个for循环是遍历list长度这么多次;你要是用一个for循环的话 这个list只循环了一次,所以要再加一个循环;
def numbers(numbers): for i in range(len(numbers)-1): if numbers[i] > numbers[i+1]: numbers[i],numbers[i+1] = numbers[i+1],numbers[i] # print(i) #print(numbers[0]) print(numbers) numbers([4,3,2,1])
先写一个for循环,打印结果如下:
[3, 2, 1, 4]
循环了一次,把最大的放到最后面了,if 语句
for i in range(len(numbers)-1):
if numbers[i] > numbers[i+1]:
numbers[i],numbers[i+1] = numbers[i+1],numbers[i]
这块的意思是,如果list中第i个元素比第i+1个元素大的话,那么这两个元素调换位置;
上述代码完成了,第一次循环;
def numbers(numbers): for i in range(len(numbers)-1): for j in range(len(numbers)-1): if numbers[j] > numbers[j+1]: numbers[j],numbers[j+1] = numbers[j+1],numbers[j] # print(i) #print(numbers[0]) print(numbers)
numbers([7,6,5,4,3,2,1])
这里为啥要用len(numbers)-1此呢,如果你要是用len(numbers)次,那么i+1是不是就超出索引范围了是吧~
我再加上一个for循环,让j循环len(numbers)-1次,还是判断语句一样的,它会把剩下的冒泡完排序,打印结果:
[1, 2, 3, 4, 5, 6, 7]
这里可以优化对不对?
for j in range(len(numbers)-1):
这里j用循环这么多次吗,不用对不对,因为 上一个i循环 已经把list最后的排序排出来了,我们只要循环i之前的元素就行了吧,是吧,所以优化:
for j in range(len(numbers)-1-i):
初级菜鸟,仅供参考~