Tại sao sắp xếp lựa chọn nhanh hơn sắp xếp bong bóng?


28

Nó được viết trên Wikipedia rằng "... sắp xếp lựa chọn hầu như luôn vượt trội so với sắp xếp bong bóng và sắp xếp gnome." Ai đó có thể vui lòng giải thích cho tôi tại sao sắp xếp lựa chọn được coi là nhanh hơn sắp xếp bong bóng mặc dù cả hai đều có:

  1. Độ phức tạp thời gian trường hợp xấu nhất : O(n2)

  2. Số lượng so sánh : O(n2)

  3. Độ phức tạp trường hợp tốt nhất :

    • Sắp xếp bong bóng: O(n)
    • Lựa chọn sắp xếp: O(n2)
  4. Độ phức tạp thời gian trường hợp trung bình :

    • Sắp xếp bong bóng: O(n2)
    • Lựa chọn sắp xếp: O(n2)

Câu trả lời:


32

Tất cả các phức tạp bạn cung cấp là đúng, tuy nhiên chúng được đưa ra trong ký hiệu Big O , vì vậy tất cả các giá trị cộng và hằng được bỏ qua.

Để trả lời câu hỏi của bạn, chúng tôi cần tập trung vào phân tích chi tiết về hai thuật toán đó. Phân tích này có thể được thực hiện bằng tay, hoặc tìm thấy trong nhiều cuốn sách. Tôi sẽ sử dụng kết quả từ Nghệ thuật lập trình máy tính của Knuth .

Số lượng so sánh trung bình:

  • Sắp xếp bong bóng : 12(N2NlnN(γ+ln21)N)+O(N)
  • Sắp xếp chèn : 14(N2N)+NHN
  • Lựa chọn sắp xếp : (N+1)HN2N

Bây giờ, nếu bạn vẽ các hàm đó, bạn sẽ có được một cái gì đó như thế này: âm mưu lô2

Như bạn có thể thấy, sắp xếp bong bóng tồi tệ hơn nhiều khi số lượng phần tử tăng lên, mặc dù cả hai phương pháp sắp xếp đều có độ phức tạp tiệm cận giống nhau.

Phân tích này dựa trên giả định rằng đầu vào là ngẫu nhiên - điều này có thể không đúng mọi lúc. Tuy nhiên, trước khi bắt đầu sắp xếp, chúng ta có thể hoán vị ngẫu nhiên chuỗi đầu vào (sử dụng bất kỳ phương thức nào) để thu được trường hợp trung bình.

Tôi đã bỏ qua phân tích độ phức tạp thời gian bởi vì nó phụ thuộc vào việc thực hiện, nhưng các phương pháp tương tự có thể được sử dụng.


Tôi có một vấn đề với "chúng ta có thể hoán vị ngẫu nhiên chuỗi đầu vào để có được trường hợp avarage". Tại sao điều đó có thể được thực hiện nhanh hơn thời gian cần thiết để sắp xếp?
Sasho Nikolov

1
NNO(NlogN)N

Tôi đoán tôi đã buồn ngủ, bạn nói đúng, trình tự có thể được hoán vị trong thời gian tuyến tính.
Sasho Nikolov

HN=Θ(logN)

Gamma = 0,577216 là hằng số của Euler-Mascheroni. Chương liên quan là "Nghệ thuật lập trình" tập 3 phần 5.2.2 pg. 109 và 129. Làm thế nào bạn vẽ sơ đồ trường hợp sắp xếp bong bóng chính xác đặc biệt là thuật ngữ O (sqrt (N))? Bạn đã bỏ bê nó?
mxmlnkn

11

O

Bản thân hàm, ví dụ số lượng so sánh và / hoặc hoán đổi, có thể khác nhau đối với hai thuật toán có cùng chi phí tiệm cận, miễn là chúng phát triển với cùng tốc độ.

n/41

Về số lượng so sánh, Bubble sort yêu cầu k×nkn/2(n1)×(n2)/2

Tóm lại, giới hạn tiệm cận cho bạn cảm giác tốt về cách chi phí của thuật toán tăng lên so với kích thước đầu vào, nhưng không nói gì về hiệu suất tương đối của các thuật toán khác nhau trong cùng một tập hợp.


1
đây thậm chí là câu trả lời rất hay
Grijesh Chauhan

bạn thích cuốn sách nào
Grijesh Chauhan

@GrijeshChauhan: Sách là vấn đề của hương vị, vì vậy hãy đưa ra bất kỳ khuyến nghị nào với một hạt muối. Cá nhân tôi thích "Giới thiệu về thuật toán" của Cormen, Leiserson và Rivest, cung cấp một cái nhìn tổng quan tốt về một số chủ đề và loạt bài "Nghệ thuật lập trình máy tính" của Knuth nếu bạn cần thêm / tất cả chi tiết về bất kỳ chủ đề cụ thể nào. Bạn có thể muốn kiểm tra xem câu hỏi về sách đã được hỏi ở đây trước đó chưa, hoặc đăng câu hỏi đó nếu không.
Pedro

Đối với tôi, para thứ ba trong câu trả lời của bạn là câu trả lời thực tế. Không phải là biểu đồ cho đầu vào lớn, được đưa ra trong câu trả lời khác.
trao đổi quá mức

3

Sắp xếp bong bóng sử dụng nhiều lần trao đổi hơn, trong khi sắp xếp lựa chọn tránh điều này.

Khi sử dụng chọn sắp xếp, nó hoán đổi nthời gian nhiều nhất. nhưng khi sử dụng sắp xếp bong bóng, nó hoán đổi gần như n*(n-1). Và rõ ràng thời gian đọc ít hơn thời gian viết ngay cả trong bộ nhớ. Thời gian so sánh và thời gian chạy khác có thể được bỏ qua. Vì vậy, thời gian trao đổi là nút cổ chai quan trọng của vấn đề.


Tôi nghĩ rằng câu trả lời khác của Bartek là hợp lý hơn nhưng tôi không thể bỏ phiếu hoặc nhận xét ... BTW Tôi vẫn nghĩ rằng thời gian viết ảnh hưởng lớn hơn và hy vọng anh ấy có thể cân nhắc điều này nếu anh ấy thấy điều này và đồng ý.
simonmysun

Bạn không thể đơn giản bỏ qua số lượng so sánh, vì có những trường hợp sử dụng trong đó thời gian để so sánh hai mặt hàng có thể vượt xa thời gian để trao đổi hai mặt hàng. Hãy xem xét một danh sách các chuỗi cực dài được liên kết (mỗi ký tự 100 nghìn ký tự). Đọc trong mỗi chuỗi sẽ mất nhiều thời gian hơn để thực hiện việc gán lại con trỏ.
Irvin Lim

@IrvinLim Tôi nghĩ bạn có thể đúng nhưng tôi có thể phải xem dữ liệu thống kê trước khi tôi đổi ý.
simonmysun
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.