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] 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 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 [3, 5, 6, 7, 2, 8] ở đây, 35, 6, 7, 2, 8] - > [3, 5, 6, 7, 2, 8] here, 5 [3, 5, 6, 7, 2, 8] ở đây, 56, 7, 2, 8] - > [3, 5, 6, 7, 2, 8] here, 6 [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 [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 [3, 5, 6, 7, 2, 8] ở đây, 35, 6, 2, 7, 8] - > [3, 5, 6, 7, 2, 8] here, 5 [3, 5, 6, 7, 2, 8] ở đây, 56, 2, 7, 8] - > [3, 5, 2, 6, 7, 8] here, 6 [3, 5, 2, 6, 7, 8] ở đây, 66, 7, 8] - > [3, 5, 2, 6, 7, 8] here 6 [3, 5, 2, 6, 7, 8] ở đây 67, 8] - > [3, 5, 2, 6, 7, 8] here 7 [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.