冒泡排序
冒泡排序算法的核心思想是将一个元素与其他所有元素进行比较,将最大的元素或者最小的元素放到第一或者末尾,然后再进行第二轮比较,直到比较完所有的元素,假设有[9, 5, 7, 3, 8]五个元素,那么两两比较选出最大的元素需要比较4次,如9和5比较选出最大值,然后最大值和7比较选出最大值,一直比较下去,直到最后与8进行比较,就相当于把一段绳子砍成5段需要砍4次的道理是一样的,然后每一次比较完就会少一个元素参与比较,因为在每一次比较中都会把当前最大值给找出来,并上浮(冒泡),那么一个n元素的数组/列表(python中叫列表)就需要重复n-1次。在java/c/c++中我们可能会用for(i=0, i<n, i++),这个方法来完成循环,但是在python和shell中有一个更通俗易懂的语法,那就是for i in range(n),然后i的值会从0递增到n-1,也能实现for(i=0, i<n, i++)的相同效果。
在第二重循环中(size - i - 1)而不是(size - i)是为了防止数组/列表索引溢出,当j为最后一个元素时,j+1就超出数组/列表的大小了
方法1
将两数相加再相减的方式来互换位置
def bubble_sort1(srcArr):
size = len(srcArr)
for i in range(size):
for j in range(size - i - 1):
if srcArr[j] > srcArr[j+1]:
srcArr[j] += srcArr[j+1]
srcArr[j+1] = srcArr[j] - srcArr[j+1]
srcArr[j] -= srcArr[j+1]
return srcArr
if __name__ == "__main__":
arr = [9, 5, 7, 3, 8]
print("=======================")
print(arr)
result1 = bubble_sort1(arr)
print("=======================")
print(result1)
方法2
使用python的高级特性来互换位置
def bubble_sort2(srcArr):
size = len(srcArr)
for i in range(size):
for j in range(size-i-1):
if srcArr[j] > srcArr[j+1]:
srcArr[j], srcArr[j+1] = srcArr[j+1], srcArr[j]
return srcArr
if __name__ == "__main__":
arr = [9, 5, 7, 3, 8]
print("=======================")
print(arr)
result2 = bubble_sort2(arr)
print("=======================")
print(result2)
方法3
使用一个中间变量来互换位置
def bubble_sort3(srcArr):
size = len(srcArr)
for i in range(size):
for j in range(size-i-1):
if srcArr[j] > srcArr[j+1]:
tmp = srcArr[j]
srcArr[j] = srcArr[j+1]
srcArr[j+1] = tmp
return srcArr
if __name__ == "__main__":
arr = [9, 5, 7, 3, 8]
print("=======================")
print(arr)
result3 = bubble_sort3(arr)
print("=======================")
print(result3)
方法4
降序
def reverse_order(l):
data_list = l
for i in range(len(data_list) - 1):
for j in range(i+1, len(l)):
if data_list[i] < data_list[j]:
data_list[i],data_list[j] = data_list[j], data_list[i]
return data_list
if __name__ == "__main__":
a = [34, 541, 56, 1, 68, 998, 711, 22]
print(reverse_order(a))
升序
def reverse_order(l):
data_list = l
for i in range(len(data_list) - 1):
for j in range(i+1, len(l)):
if data_list[i] > data_list[j]:
data_list[i],data_list[j] = data_list[j], data_list[i]
return data_list
if __name__ == "__main__":
a = [34, 541, 56, 1, 68, 998, 711, 22]
print(reverse_order(a))