📜  Python冒泡排序

📅  最后修改于: 2020-10-29 01:07:56             🧑  作者: Mango

在Python冒泡排序

在各种排序算法中,冒泡排序是一种简单的算法。我们将其作为第一个排序算法进行学习。它易于学习且高度直观。它可以很容易地实现到代码中,这对初学者软件开发人员非常有益。但这是对每个元素进行排序的最差算法,因为它会在每次对数组进行排序或不排序时进行检查。

让我们了解气泡排序的概念。

气泡排序的概念

冒泡排序使用简单明了的逻辑,即如果相邻元素的排列顺序不正确,则会重复交换它们。它一次比较一对,如果第一个元素大于第二个元素,则交换。否则,请移至下一对元素进行比较。

让我们通过一个例子来理解它-

范例-

我们正在创建一个元素列表,其中存储了整数

list1 = [5、3、8、6、7、2]

在这里,算法对元素进行排序-

第一次迭代

它比较前两个元素,这里5> 3然后相互交换。现在我们得到新列表是-

[3、5、8、6、7、2]

在第二个比较中,5 <8然后发生交换-

[3、5、8、6、7、2]

在第三个比较中,8> 6然后交换-

[3、5、6、8、7、2]

在第四次比较中,8> 7然后交换-

[3、5、6、7、8、2]

在第五次比较中,8> 2然后交换-

[3,5,6,7,2,8]

第一次迭代到此完成,最后得到最大的元素。现在我们需要len(list1)-1

第二次迭代

第三次迭代

它将迭代直到列表被排序。

第四次迭代-

第五次迭代

检查每个元素,我们可以看到我们的列表是使用冒泡排序技术排序的。

用Python代码实现

我们已经描述了气泡排序技术。现在,我们将在Python代码中实现逻辑。

程序

# Creating a bubble sort function
def bubble_sort(list1):
    # Outer loop for traverse the entire list
    for i in range(0,len(list1)-1):
        for j in range(len(list1)-1):
            if(list1[j]>list1[j+1]):
                temp = list1[j]
                list1[j] = list1[j+1]
                list1[j+1] = temp
    return list1

list1 = [5, 3, 8, 6, 7, 2]
print("The unsorted list is: ", list1)
# Calling the bubble sort function
print("The sorted list is: ", bubble_sort(list1))

输出:

The unsorted list is:  [5, 3, 8, 6, 7, 2]
The sorted list is:  [2, 3, 5, 6, 7, 8]

说明:

在上面的代码中,我们定义了bubble_sort()函数,该函数以list1作为参数。

  • 在函数内部,我们定义了两个for循环-第一个for循环迭代完整列表,第二个for循环迭代列表,并在每次外部循环迭代中比较两个元素。
  • for循环到达末尾时将终止。
  • 我们在内部for循环中定义了条件;如果第一索引值大于第二索引值,则彼此交换位置。
  • 我们调用了函数并传递了一个列表。迭代并返回排序列表。

不使用临时变量

我们也可以不使用temp变量而交换元素。 Python具有非常独特的语法。我们可以使用以下代码行。

范例-

def bubble_sort(list1):
    # Outer loop for traverse the entire list
    for i in range(0,len(list1)-1):
        for j in range(len(list1)-1):
            if(list1[j]>list1[j+1]): 
                # here we are not using temp variable
                list1[j],list1[j+1] = list1[j+1], list1[j]
    return list1

list1 = [5, 3, 8, 6, 7, 2]
print("The unsorted list is: ", list1)
# Calling the bubble sort function
print("The sorted list is: ", bubble_sort(list1))

输出:

The unsorted list is:  [5, 3, 8, 6, 7, 2]
The sorted list is:  [2, 3, 5, 6, 7, 8]

Python代码实现的优化

我们可以使用两种技术来优化上面的代码。交换未完成;这意味着列表已排序。在先前的技术中-先前的技术将评估完整列表,尽管似乎不需要这样做。

我们可以使用布尔值标志防止不必要的评估,并检查上一节中是否进行了任何交换。

范例-

def bubble_sort(list1):
   # We can stop the iteration once the swap has done
    has_swapped = True

    while(has_swapped):
        has_swapped = False
        for i in range(len(list1) - 1):
            if list1[i] > list1[i+1]:
                # Swap
                list1[i], list1[i+1] = list1[i+1], list1[i]
                has_swapped = True
    return list1


list1 = [5, 3, 8, 6, 7, 2]
print("The unsorted list is: ", list1)
# Calling the bubble sort function
print("The sorted list is: ", bubble_sort(list1))

输出:

The unsorted list is:  [5, 3, 8, 6, 7, 2]
The sorted list is:  [2, 3, 5, 6, 7, 8]

在第二种技术中,我们考虑以下事实:当列表的最大元素结束于列表的末尾时,迭代结束。

第一次,我们使用n位置在终点位置传递最大的元素。第二次,我们经过第二大元素n-1位置。

在每个连续的迭代中,我们可以比以前少一个元素进行比较。更准确地说,在第k次迭代中,只需要在前n-k + 1个元素进行比较:

范例-

def bubble_sort(list1):
    has_swapped = True

    total_iteration = 0

    while(has_swapped):
        has_swapped = False
        for i in range(len(list1) - total_iteration - 1):
            if list1[i] > list1[i+1]:
                # Swap
                list1[i], list1[i+1] = list1[i+1], list1[i]
                has_swapped = True
        total_iteration += 1
    print("The number of iteraton: ",total_iteration)
    return list1

list1 = [5, 3, 8, 6, 7, 2]
print("The unsorted list is: ", list1)
# Calling the bubble sort funtion
print("The sorted list is: ", bubble_sort(list1))

输出:

The unsorted list is:  [5, 3, 8, 6, 7, 2]
The number of iteraton:  6
The sorted list is:  [2, 3, 5, 6, 7, 8]

时间比较

让我们看看以上代码片段之间的时间比较。

Unoptimized Bubble Sort Takes: 0.0106407
Optimize Bubble Sort Takes: 0.0078251
Bubble Sort with a Boolean flag and shortened list Takes: 0.0075207 

所有技术对于较少的元素都是有用的,但是如果列表包含许多元素,则第二种优化技术会产生很大的不同。