数据结构算法--排序--冒泡排序
程序员文章站
2022-06-04 15:00:25
...
冒泡排序是交换排序的一种,所以需要两两比较,在满足判定条件的情况下,进行交换操作;
动图解释
算法分析
假设数组中有N 个数字需要排序;
1. 需要N-1轮排序【最后两个一次排序就可确定】,如果不设置 没轮里面,比较的次数,那么需要N-1词的,设置的话就是N-i次
2. 冒泡排序中, 每进行一次排序,总是会把最大量找出来,放在最后一个位置;
例:第一趟比较之后,排在最后的一个数一定是最大的一个数,第二趟排序的时候,只需要比较除了最后一个数以外的其他的数,同样也能找出一个最大的数排在参与第二趟比较的数后面,第三趟比较的时候,只需要比较除了最后两个数以外的其他的数,以此类推……也就是说,没进行一趟比较,每一趟少比较一次,一定程度上减少了算法的量。
3. 时间复杂度
1.如果我们的数据正序,只需要走一趟即可完成排序【需要设置一个flag方可实现】。所需的比较次数C和记录移动次数M均达到最小值,
即:Cmin=n-1;Mmin=0;所以,冒泡排序最好的时间复杂度为O(n)。
2.如果很不幸我们的数据是反序的,则需要进行n-1趟排序。每趟排序要进行n-i次比较(1≤i≤n-1),且每次比
较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:
综上所述:冒泡排序总的平均时间复杂度为:O(n2) ,时间复杂度和数据状况无关。
3. 代码实现
d0 = [1, 2, 3, 4, 5, 6, 7]
d0_out = [2, 2, 2, 3, 4, 4, 4, 4, 5, 5, 5, 6, 6, 7, 9, 12, 15, 44, 45, 54, 64] # 正确排序
# 最原始的冒泡排序
class BubbleSort():
def solution1(self, array):
if array is None or len(array) == 0:
return
count = 0
n = len(array)
for _ in range(n-1):
max_index = n - 1
for i in range(n-1):
if array[i] > array[i+1]:
array[i], array[i+1] = array[i+1], array[i]
count += 1
max_index -= 1
print('array length {}, exchange numbers {}'.format(n, count))
return array
def solution2(self, array):
if array is None or len(array) == 0:
return
n = len(array)
count = 0
for _ in range(n-1):
max_index = n - 1
exchange_flag = False
for j in range(max_index):
if array[j] > array[j+1]:
array[j], array[j+1] = array[j+1], array[j]
count += 1
exchange_flag = True
if not exchange_flag:
break
print('array length {}, exchange numbers {}'.format(n, count))
return array
bubble = BubbleSort()
print(bubble.solution1(d0))