欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据结构算法--排序--冒泡排序

程序员文章站 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))

 

相关标签: 算法技术栈