Hướng dẫn python bubble sort list comprehension - hiểu danh sách sắp xếp bong bóng python

Sử dụng một danh sách hiểu để ẩn một vòng lặp là loại gian lận cho rằng kết quả được tạo ra bởi sự hiểu biết không phải là danh sách được sắp xếp. Nhưng nếu bạn sẽ làm điều đó, bạn có thể muốn tránh xây dựng danh sách không có yếu tố nào bằng cách thực hiện các giao dịch hoán đổi trong điều kiện thay vì giá trị đầu ra.

Ví dụ:

a = [1, 3, 2, 6, 5, 4]
[_ for n in range(len(a),1,-1) for i in range(n-1) if a[i]>a[i+1] and a.__setitem__(slice(i,i+2),a[i:i+2][::-1])]

Cách ly phần hoán đổi phần tử, điều này sẽ cung cấp:

swap = lambda(a,i):a.__setitem__(slice(i,i+2),a[i:i+2][::-1])
[_ for n in range(len(a),1,-1) for i in range(n-1) if a[i]>a[i+1] and swap(a,i)]

Không khác gì:

for n in range(len(a),1,-1):
    for i in range(n-1):
        if a[i]>a[i+1]: 
           swap(a,i)     # same as a[i],a[i+1] = a[i+1],a[i]

Sự hiểu biết danh sách chỉ là một cách khác để viết vòng lặp cho vòng lặp và không thực sự trả về kết quả được sắp xếp.

Những gì sẽ có nhiều hơn trong tinh thần của một danh sách hiểu là thực sự trả về kết quả được sắp xếp mà không ảnh hưởng đến danh sách ban đầu. Bạn có thể làm điều này bằng cách sử dụng danh sách tạm thời trong phạm vi hiểu để thực hiện hoán đổi phần tử và dần dần trả lại vị trí được đảm bảo là đúng chỉ mục được sắp xếp đúng:

a = [1, 3, 2, 6, 5, 4]
s = [ b.pop(-1) for b in [list(a)] for n in range(len(a),0,-1) if not [_ for i in range(n-1) if b[i]

Cách tiếp cận giống như trước đây ngoại trừ b được sử dụng bên trong để quản lý hoán đổi và trả về các giá trị được sắp xếp. Do vị trí được sắp xếp được bảo đảm luôn là vị trí cuối cùng trong b, điều kiện hoán đổi đã được đảo ngược để nội bộ b được sắp xếp theo thứ tự giảm dần tạo ra đầu ra theo thứ tự tăng dần khi lấy vật phẩm cuối cùng ở mỗi lần lặp.

Lưu ý rằng tất cả các giải pháp này không thực hiện được điều kiện thoát sớm cho phép sắp xếp bong bóng rất hiệu quả trên các danh sách và danh sách đã được sắp xếp trong đó các yếu tố gần vị trí được sắp xếp của chúng (nghĩa là dừng khi không hoán đổi trong một lần vượt qua). Số lần lặp sẽ luôn là n*(n+1)/2 bất kể thứ tự ban đầu của các yếu tố tạo ra độ phức tạp về thời gian của O (n^2) mọi lúc thay vì trường hợp xấu nhất.

Đối với I trong phạm vi (0, LEN (list1) -1):.

# Bubble sort in python
# Sorts numbers in ascending order
str_input = input("Please enter numbers separated by spaces: ")

# split the string into numbers & create a list of numbers
numbers = [int(x) for x in str_input.split()]

count = len(numbers)

for outer in range(count-1): # bubbles each number to the end
    for i in range(count-outer-1):
        if numbers[i] > numbers[i+1]:
            # swap numbers!
            numbers[i],numbers[i+1] = numbers[i+1],numbers[i]

print(numbers)

cho J trong phạm vi (LEN (list1) -1):.split() function and then converted to a list of numbers using the int() function and list comprehension.

Chương trình sau đó sử dụng hai vòng lồng nhau để sắp xếp các số. Vòng lặp bên ngoài chạy nhiều lần như các số trong danh sách. Đối với mỗi lần lặp vòng bên trong, số lớn nhất được sủi bọt bên phải. Do đó, cho mỗi lần lặp vòng ngoài, chúng tôi nhận được số lượng lớn tiếp theo được sủi bọt sang phải. & NBSP; Lưu ý rằng chúng tôi đang sử dụng một gán tuple trong Python để trao đổi hai giá trị trong danh sách. Không cần một biến tạm thời để hoán đổi các giá trị biến.

Đây là đầu ra mẫu từ chương trình,

Python3 bongblesort.py Vui lòng nhập các số được phân tách bằng khoảng trắng: 8 129 22 42 22 1 [1, 8, 22, 22, 42, 129]
Please enter numbers separated by spaces: 8 129 22 42 22 1
[1, 8, 22, 22, 42, 129]

Đối với I trong phạm vi (0, LEN (list1) -1):.

Hãy hiểu các khái niệm về loại bong bóng.

Khái niệm về loại bong bóng

Sắp xếp bong bóng sử dụng logic đơn giản hoạt động bằng cách lặp lại việc hoán đổi các phần tử liền kề nếu chúng không đúng thứ tự. Nó so sánh một cặp tại một thời điểm và hoán đổi nếu phần tử thứ nhất lớn hơn phần tử thứ hai; Nếu không, di chuyển xa hơn đến cặp yếu tố tiếp theo để so sánh.

Hãy hiểu nó bằng một ví dụ -

Thí dụ -

Chúng tôi đang tạo một danh sách các phần tử, lưu trữ các số nguyên

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

Ở đây thuật toán sắp xếp các yếu tố -

Lặp lại đầu tiên

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

Nó so sánh hai yếu tố đầu tiên và ở đây 5> 3 sau đó trao đổi với nhau. Bây giờ chúng tôi nhận được danh sách mới là -

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

Trong so sánh thứ hai, 5 <8 sau đó hoán đổi xảy ra -

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

Trong so sánh thứ hai, 5 <8 sau đó hoán đổi xảy ra -

Trong so sánh thứ ba, 8> 6 sau đó hoán đổi -6, 8, 7, 2]

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

Trong so sánh thứ tư, 8> 7 sau đó hoán đổi -7, 8, 2]

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

Trong so sánh thứ năm, 8> 2 sau đó hoán đổi-2, 8]

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

Ở đây lần lặp đầu tiên hoàn tất và chúng tôi có được yếu tố lớn nhất vào cuối. Bây giờ chúng ta cần Len (List1) - 1

Lặp lại thứ hai3, 5, 6, 7, 2, 8] - > [3, 5, 6, 7, 2, 8] here, 3<5 then no swap taken place

[3, 5, 6, 7, 2, 8] -> [3, 5, 6, 7, 2, 8] ở đây, 35, 6, 7, 2, 8] - > [3, 5, 6, 7, 2, 8] here, 5<6 then no swap taken place

[3, 5, 6, 7, 2, 8] -> [3, 5, 6, 7, 2, 8] ở đây, 56, 7, 2, 8] - > [3, 5, 6, 7, 2, 8] here, 6<7 then no swap taken place

[3, 5, 6, 7, 2, 8] -> [3, 5, 6, 7, 2, 8] ở đây, 67, 2, 8] - > [3, 5, 6, 2, 7, 8] here 7>2 then swap their position. Now

[3, 5, 6, 7, 2, 8] -> [3, 5, 6, 2, 7, 8] ở đây 7> 2 sau đó trao đổi vị trí của họ. Hiện nay2, 7, 8] - > [3, 5, 6, 2, 7, 8] here 7<8 then no swap taken place.

[3, 5, 6, 2, 7, 8] -> [3, 5, 6, 2, 7, 8] ở đây 7

Lặp lại thứ ba3, 5, 6, 2, 7, 8] - > [3, 5, 6, 7, 2, 8] here, 3<5 then no swap taken place

[3, 5, 6, 2, 7, 8] -> [3, 5, 6, 7, 2, 8] ở đây, 35, 6, 2, 7, 8] - > [3, 5, 6, 7, 2, 8] here, 5<6 then no swap taken place

[3, 5, 6, 2, 7, 8] -> [3, 5, 6, 7, 2, 8] ở đây, 56, 2, 7, 8] - > [3, 5, 2, 6, 7, 8] here, 6<2 then swap their positions

[3, 5, 6, 2, 7, 8] -> [3, 5, 2, 6, 7, 8] ở đây, 66, 7, 8] - > [3, 5, 2, 6, 7, 8] here 6<7 then no swap taken place. Now

[3, 5, 2, 6, 7, 8] -> [3, 5, 2, 6, 7, 8] ở đây 67, 8] - > [3, 5, 2, 6, 7, 8] here 7<8 then swap their position.

[3, 5, 2, 6, 7, 8] -> [3, 5, 2, 6, 7, 8] ở đây 7

Nó sẽ lặp lại cho đến khi danh sách được sắp xếp.

Lặp lại thứ tư -3, 5, 2, 6, 7, 8] - > [3, 5, 2, 6, 7, 8]

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

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

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

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

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

Lặp lại thứ năm3, 2, 5, 6, 7, 8] - > [2, 3, 5, 6, 7, 8]

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

Kiểm tra từng phần tử và như chúng ta có thể thấy rằng danh sách của chúng ta được sắp xếp bằng kỹ thuật sắp xếp bong bóng.

Thực hiện trong mã Python

Chúng tôi đã mô tả kỹ thuật sắp xếp bong bóng. Bây giờ, chúng tôi sẽ thực hiện logic trong mã Python.

Output:

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

Explanation:

Chương trìnhbubble_sort() function which takes list1 as an argument.

  • Trong mã trên, chúng tôi đã xác định hàm bubble_sort () lấy List1 làm đối số.
  • Bên trong hàm, chúng tôi đã xác định hai cho vòng lặp - đầu tiên cho vòng lặp lặp lại danh sách đầy đủ và thứ hai cho vòng lặp lặp lại danh sách và so sánh hai phần tử trong mỗi lần lặp lại vòng ngoài.
  • Vòng lặp FOR sẽ bị chấm dứt khi nó đạt đến cuối.
  • Chúng tôi đã xác định điều kiện ở bên trong cho vòng lặp; Nếu giá trị chỉ mục đầu tiên lớn hơn giá trị chỉ mục thứ hai, hãy trao đổi vị trí của chúng với nhau.

Chúng tôi đã gọi chức năng và vượt qua một danh sách; Nó lặp đi lặp lại và trả lại danh sách sắp xếp.

Mà không cần sử dụng biến nhiệt độ

Thí dụ -

Output:

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

Chúng ta cũng có thể trao đổi các yếu tố mà không cần sử dụng biến TEMP. Python có một cú pháp rất độc đáo. Chúng ta có thể sử dụng các dòng mã sau.

Tối ưu hóa việc thực hiện mã Python

Chúng ta có thể tối ưu hóa mã trên bằng hai kỹ thuật. Các giao dịch hoán đổi không được thực hiện; Nó có nghĩa là danh sách được sắp xếp. Trong kỹ thuật trước - kỹ thuật trước đây sẽ đánh giá danh sách đầy đủ mặc dù dường như không cần thiết phải làm.Boolean flag and checks if any swaps were made in the previous section.

Thí dụ -

Output:

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

Chúng tôi có thể ngăn chặn đánh giá không cần thiết bằng cách sử dụng cờ Boolean và kiểm tra xem có bất kỳ giao dịch hoán đổi nào được thực hiện trong phần trước.

Trong kỹ thuật thứ hai, chúng tôi xem xét thực tế là việc lặp lại kết thúc khi yếu tố lớn nhất của danh sách kết thúc ở cuối danh sách.

Lần đầu tiên, chúng tôi vượt qua phần tử lớn nhất ở vị trí cuối bằng vị trí N. Lần thứ hai, chúng tôi đi qua vị trí N-1, yếu tố lớn thứ hai.n - k + 1 elements:

Thí dụ -

Output:

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]

Trong mỗi lần lặp liên tiếp, chúng ta có thể so sánh ở một yếu tố ít hơn trước. Chính xác hơn, trong lần lặp K -th, chỉ cần so sánh ở các phần tử N - K + 1 đầu tiên:

So sánh thời gian

Hãy xem thời gian so sánh giữa các đoạn mã trên.


Sắp xếp bong bóng với ví dụ là gì?

Sắp xếp bong bóng bắt đầu với hai yếu tố đầu tiên, so sánh chúng để kiểm tra cái nào lớn hơn. . Trao đổi từ 5> 4.starts with very first two elements, comparing them to check which one is greater. ( 5 1 4 2 8 ) –> ( 1 5 4 2 8 ), Here, algorithm compares the first two elements, and swaps since 5 > 1. ( 1 5 4 2 8 ) –> ( 1 4 5 2 8 ), Swap since 5 > 4.

Làm thế nào để bạn sắp xếp một danh sách bằng cách hoán đổi trong Python?

So sánh phần tử thứ nhất và thứ hai của danh sách và trao đổi chúng nếu chúng theo thứ tự sai. So sánh phần tử thứ hai và thứ ba của danh sách và trao đổi chúng nếu chúng theo thứ tự sai. Tiến hành cho đến yếu tố cuối cùng của danh sách theo cách tương tự. Lặp lại tất cả các bước trên cho đến khi danh sách được sắp xếp.

Làm thế nào để bạn sắp xếp một danh sách trong bong bóng sắp xếp trong Python?

Thực hiện trong mã Python..
# Tạo chức năng sắp xếp bong bóng ..
def bubble_sort (list1):.
# Vòng lặp bên ngoài cho Traverse Toàn bộ danh sách ..
Đối với I trong phạm vi (0, LEN (list1) -1):.
cho J trong phạm vi (LEN (list1) -1):.
if(list1[j]>list1[j+1]):.
temp = list1 [j].
list1 [j] = list1 [j+1].

Làm thế nào để bạn viết mã giả để sắp xếp bong bóng?

Mã giả phân loại bong bóng Chúng tôi bắt đầu với phần tử đầu tiên và chỉ mục I = 0 và kiểm tra xem phần tử có ở I+1 lớn hơn thì chúng tôi trao đổi các phần tử tại Index I và I+1.Nếu ở trên không phải là trường hợp, thì sẽ không có sự hoán đổi sẽ diễn ra.Bây giờ, tôi đã tăng lên và 2 bước trên xảy ra một lần nữa cho đến khi mảng cạn kiệt.We start with the first element and i=0 index and check if the element present at i+1 is greater then we swap the elements at index i and i+1. If above is not the case, then no swapping will take place. Now “ i ” gets incremented and the above 2 steps happen again until the array is exhausted.