Sự ổn định trong các thuật toán sắp xếp là gì và tại sao nó quan trọng?


292

Tôi rất tò mò, tại sao sự ổn định là hoặc không quan trọng trong việc sắp xếp các thuật toán?


2
Vì mục đích song song? ví dụ: sắp xếp hợp nhất là ổn định và có thể được song song tốt và quicksort cũng vậy.
DarthVader

13
QuickSort cổ điển không ổn định
Konstantin Spirin

9
algo sắp xếp ổn định -IBM (Insertion, Bubble, Merge)
roottraveller

Một lưu ý cho những người có thể hiểu nhầm khái niệm như tôi: Thứ tự các yếu tố bằng nhau được đảm bảo được bảo tồn. có nghĩa là: nếu các phần tử trong sắp xếp ổn định được coi là bằng nhau, thì chúng sẽ tuân theo thứ tự trước đó. Đó không phải là những gì tôi từng nghĩ: nếu các yếu tố theo thứ tự trước được coi là bằng nhau, thì trong sắp xếp ổn định sắp tới, chúng sẽ tuân theo thứ tự trước đó. Mặc dù bạn có thể tìm thấy sự hiểu biết sau này cũng có ý nghĩa trong nhiều trường hợp.
Rick

Câu trả lời:


371

Một thuật toán sắp xếp được cho là ổn định nếu hai đối tượng có các khóa bằng nhau xuất hiện theo cùng một thứ tự trong đầu ra được sắp xếp khi chúng xuất hiện trong mảng đầu vào được sắp xếp. Một số thuật toán sắp xếp ổn định theo bản chất như Sắp xếp chèn, Sắp xếp hợp nhất, Sắp xếp bong bóng, v.v. Và một số thuật toán sắp xếp không, như Sắp xếp Heap, Sắp xếp nhanh, v.v.

Bối cảnh : thuật toán sắp xếp "ổn định" giữ các mục có cùng khóa sắp xếp theo thứ tự. Giả sử chúng ta có một danh sách các từ gồm 5 chữ cái:

peach
straw
apple
spork

Nếu chúng ta sắp xếp danh sách chỉ bằng chữ cái đầu tiên của mỗi từ thì sắp xếp ổn định sẽ tạo ra:

apple
peach
straw
spork

Trong một thuật toán sắp xếp không ổn định , strawhoặc sporkcó thể thay thế cho nhau, nhưng trong một thuật toán ổn định, chúng ở cùng một vị trí tương đối (nghĩa là, strawxuất hiện trước sporktrong đầu vào, nó cũng xuất hiện trước sporktrong đầu ra).

Chúng ta có thể sắp xếp danh sách các từ bằng thuật toán này: sắp xếp ổn định theo cột 5, rồi 4, rồi 3, rồi 2, rồi 1. Cuối cùng, nó sẽ được sắp xếp chính xác. Hãy thuyết phục bản thân về điều đó. (nhân tiện, thuật toán đó được gọi là radix sort)

Bây giờ để trả lời câu hỏi của bạn, giả sử chúng tôi có một danh sách tên và họ. Chúng tôi được yêu cầu sắp xếp "theo họ, sau đó theo đầu tiên". Đầu tiên chúng ta có thể sắp xếp (ổn định hoặc không ổn định) theo tên đầu tiên, sau đó sắp xếp ổn định theo tên cuối cùng. Sau khi sắp xếp, danh sách chủ yếu được sắp xếp theo tên cuối cùng. Tuy nhiên, trong đó tên cuối cùng giống nhau, tên đầu tiên được sắp xếp.

Bạn không thể xếp các loại không ổn định theo cùng một kiểu.


Vì vậy, những gì sẽ được gọi để làm cho các từ theo thứ tự sắp xếp chính xác của rơm đào thể thao? Loại ổn định đã cho chúng tôi cùi rơm đào táo tuy nhiên st nên sau sp (đúng theo bảng chữ cái), vì vậy loại chính xác cuối cùng phải là rơm thể thao táo đào
user1416486

2
@ user1416486: Chúng tôi chỉ sắp xếp theo chữ cái đầu tiên. Với giả định đó, strawsporkso sánh bằng nhau. Sắp xếp ổn định sẽ duy trì thứ tự đầu vào, trong khi sắp xếp không ổn định không đảm bảo điều đó. "Chính xác" phụ thuộc vào ứng dụng. Hàm sắp xếp trong hầu hết các ngôn ngữ lập trình cho phép người dùng cung cấp chức năng đặt hàng tùy chỉnh. Nếu chức năng của người dùng coi các mục khác nhau là bằng nhau (ví dụ: cùng tên, họ khác nhau), sẽ giúp biết liệu thứ tự ban đầu có được giữ nguyên hay không. Xem các hàm sắp xếp mảng của OCaml để biết ví dụ trong thế giới thực.
Joey Adams

3
Tôi không hiểu dòng ..same sắp xếp khóa ? Bạn có ý nghĩa gì bởi chìa khóa ở đây? Vui lòng giải thích tuyên bố .. khóa sắp xếp trò chơi
saplingPro

2
@saplingPro: bằng cách "sắp xếp khóa", ý tôi là thứ bạn đang sắp xếp các mục theo. Vì vậy, khi sắp xếp theo chữ cái đầu tiên, thì đối với mỗi mục, "khóa sắp xếp" của nó là chữ cái đầu tiên.
Joey Adams

12
Ví dụ - Giả sử bạn có một danh sách với mỗi mục có thông tin về điểm đến của chuyến bay và giờ khởi hành. Trước tiên, bạn sắp xếp danh sách dựa trên thời gian. Chúng tôi sau đó sắp xếp nó dựa trên điểm đến. Nếu loại thứ hai ổn định, bây giờ chúng ta có tất cả các chuyến bay đến cùng một điểm và theo thứ tự thời gian khởi hành tăng dần. Nếu nó không ổn định, chúng sẽ không tăng theo thời gian.
roottraveller

55

Thuật toán sắp xếp ổn địnhthuật toán sắp xếp các phần tử giống hệt nhau theo thứ tự giống như chúng xuất hiện trong đầu vào, trong khi sắp xếp không ổn định có thể không thỏa mãn trường hợp. - Tôi cảm ơn giảng viên thuật toán của tôi Didem Gozupek đã cung cấp cái nhìn sâu sắc về các thuật toán .

Các thuật toán sắp xếp ổn định:

  • Sắp xếp chèn
  • Hợp nhất sắp xếp
  • Sắp xếp bong bóng
  • Sắp xếp thời gian
  • Sắp xếp đếm
  • Sắp xếp khối
  • Quadsort
  • Sắp xếp thư viện
  • Cocktail shaker Sắp xếp
  • Sắp xếp Gnome
  • Ngay cả Sắp xếp

Các thuật toán sắp xếp không ổn định:

  • Sắp xếp đống
  • Lựa chọn sắp xếp
  • Sắp xếp vỏ
  • Sắp xếp nhanh chóng
  • Introsort (theo Quicksort)
  • Phân loại cây
  • Sắp xếp chu kỳ
  • Smoothsort
  • Loại giải đấu (theo Hesapsort)

nhập mô tả hình ảnh ở đây


2
Giá trị của bạn không bằng nhau. Bạn so sánh 9,7 và 9,8 nhưng theo kiểm tra độ ổn định, bạn cần các giá trị giống như cả 9,7 hoặc cả 9,8. Và hơn các giá trị tương tự nên được sắp xếp theo cùng một thuật toán ổn định.
erhun

1
Không, để kiểm tra sự ổn định, các giá trị của bạn phải giống nhau. Ý tôi là giả sử rằng bạn sử dụng hai 9,7 và đặt tên cho nút A và nút B. Nếu mọi thứ tự hoạt động sắp xếp giống như A, B (thay vì chúng bằng nhau) hiểu rằng thuật toán sắp xếp là ổn định (như sắp xếp hợp nhất). Nếu thứ tự A, B thay đổi khi sắp xếp chúng nhiều lần (1. Sắp xếp A, B rồi B, A lại A, B, v.v.), hãy hiểu rằng thuật toán sắp xếp không ổn định (như sắp xếp nhanh) @snr
erhun

@snr [9, 6] không có trong Mảng đầu vào. Tôi nghĩ bạn có nghĩa là [9, 8] trong dải mảng cuối cùng.
Usman

4
@erhun Tôi tin rằng anh ta chỉ sắp xếp theo số thứ nhất (số trước dấu phẩy) và sử dụng số thứ hai làm tham chiếu cho bạn để thấy rằng số 9 đầu tiên khác với số thứ hai 9.
Tiago

20

Sắp xếp ổn định có nghĩa là các bản ghi có cùng khóa giữ nguyên thứ tự tương đối của chúng trước và sau khi sắp xếp.

Vì vậy, sự ổn định là vấn đề nếu và chỉ khi, vấn đề bạn đang giải quyết yêu cầu duy trì trật tự tương đối đó.

Nếu bạn không cần sự ổn định, bạn có thể sử dụng thuật toán nhấm nháp bộ nhớ nhanh từ thư viện, như heapsort hoặc quicksort, và quên nó đi.

Nếu bạn cần sự ổn định, nó phức tạp hơn. Các thuật toán ổn định có mức sử dụng CPU và / hoặc bộ nhớ lớn hơn so với các thuật toán không ổn định. Vì vậy, khi bạn có một tập dữ liệu lớn, bạn phải chọn giữa việc đánh bại CPU hoặc bộ nhớ. Nếu bạn bị hạn chế về cả CPU và bộ nhớ, bạn có vấn đề. Một thuật toán ổn định thỏa hiệp tốt là một loại cây nhị phân; các bài viết trên Wikipedia có một C pathetically dễ ++ thực hiện dựa trên STL.

Bạn có thể biến một thuật toán không ổn định thành một thuật toán ổn định bằng cách thêm số bản ghi gốc làm khóa vị trí cuối cùng cho mỗi bản ghi.


1
Các thuật toán ổn định như Merge Sort có cùng độ phức tạp O (NlogN) như Quicksort; số nhân liên tục trên nỗ lực là lớn hơn, mặc dù.
Jonathan Leffler

Có, và mức sử dụng bộ nhớ trên Sắp xếp hợp nhất là O (N), trong khi trên Quicksort, đó là O (log N). Lý do tôi đã đề cập Quicksort là vì qsort () là một thói quen thư viện chuẩn C, vì vậy nó thực sự có sẵn.
Bob Murphy

1
Câu trả lời tổng thể tốt nhất IMHO. kỹ thuật đa khóa được đề cập ở những người khác là thú vị nhưng được đánh giá cao; áp dụng đơn giản, nhưng có xu hướng chậm hơn nhiều so với các lựa chọn thay thế rõ ràng (chỉ cần sử dụng một loại với so sánh đa khóa hoặc sắp xếp theo khóa đầu tiên sau đó xác định và sắp xếp bất kỳ danh sách con nào có trùng lặp). Việc sắp xếp ổn định tạo ra kết quả có thể dự đoán được có thể quan trọng trong một số ứng dụng. Cụ thể, nếu bạn có hai danh sách đầu vào A, B giống hệt nhau ngoại trừ danh sách B có thêm một mục nhập, các đầu ra cho một loại ổn định sẽ giống hệt nhau ngoại trừ B có cùng mục nhập đó. Và +1 cho pgph cuối cùng.
greggo

16

Nó phụ thuộc vào những gì bạn làm.

Hãy tưởng tượng bạn có một số bản ghi người với trường tên và họ. Đầu tiên bạn sắp xếp danh sách theo tên. Nếu sau đó bạn sắp xếp danh sách với thuật toán ổn định theo họ, bạn sẽ có một danh sách được sắp xếp theo tên VÀ họ.


4
Tôi nghĩ bạn có nghĩa là "họ và tên cuối cùng". Họ thường là tên cuối cùng.
Bacon Bits

14

Có một vài lý do tại sao sự ổn định có thể quan trọng. Một là, nếu hai bản ghi không cần hoán đổi bằng cách hoán đổi chúng, bạn có thể gây ra cập nhật bộ nhớ, một trang bị đánh dấu bẩn và cần được ghi lại vào đĩa (hoặc phương tiện chậm khác).


Sự hoán đổi kỷ lục phải làm gì với sự ổn định?
dùng1683793

4

Một thuật toán sắp xếp được cho là ổn định nếu hai đối tượng có các khóa bằng nhau xuất hiện theo cùng một thứ tự trong đầu ra được sắp xếp khi chúng xuất hiện trong mảng không được sắp xếp đầu vào. Một số thuật toán sắp xếp ổn định theo bản chất như Sắp xếp chèn, Sắp xếp hợp nhất, Sắp xếp bong bóng, v.v. Và một số thuật toán sắp xếp không, như Sắp xếp Heap, Sắp xếp nhanh, v.v.

Tuy nhiên, bất kỳ thuật toán sắp xếp nào không ổn định đều có thể được sửa đổi thành ổn định. Có thể sắp xếp các cách cụ thể để làm cho nó ổn định, nhưng nói chung, mọi thuật toán sắp xếp dựa trên so sánh không ổn định về bản chất đều có thể được sửa đổi thành ổn định bằng cách thay đổi thao tác so sánh khóa để so sánh hai khóa coi vị trí là một hệ số cho các đối tượng có khóa bằng nhau.

Tài liệu tham khảo: http://www.math.uic.edu/~leon/cs-mcs401-s08/handouts/stability.pdf http://en.wikipedia.org/wiki/Sorting_alerskym#Stability


3

Tôi biết có nhiều câu trả lời cho điều này, nhưng với tôi, câu trả lời này , của Robert Harvey , đã tóm tắt nó rõ ràng hơn nhiều:

Một loại ổn định là một loại duy trì thứ tự ban đầu của bộ đầu vào, trong đó thuật toán [không ổn định] không phân biệt giữa hai hoặc nhiều mục.

Nguồn


1

Nếu bạn giả sử những gì bạn đang sắp xếp chỉ là những con số và chỉ các giá trị của chúng xác định / phân biệt chúng (ví dụ: các phần tử có cùng giá trị là nhận dạng), thì vấn đề ổn định của việc sắp xếp là vô nghĩa.

Tuy nhiên, các đối tượng có cùng mức độ ưu tiên trong sắp xếp có thể khác biệt và đôi khi thứ tự tương đối của chúng là thông tin có ý nghĩa. Trong trường hợp này, sắp xếp không ổn định tạo ra vấn đề.

Ví dụ: bạn có một danh sách dữ liệu chứa chi phí thời gian [T] của tất cả người chơi để dọn sạch mê cung với Cấp [L] trong trò chơi. Giả sử chúng ta cần xếp hạng người chơi bằng cách họ dọn dẹp mê cung nhanh như thế nào. Tuy nhiên, một quy tắc bổ sung được áp dụng: những người chơi dọn dẹp mê cung với cấp độ cao hơn luôn có thứ hạng cao hơn, bất kể chi phí thời gian là bao lâu.

Tất nhiên, bạn có thể thử ánh xạ giá trị được ghép nối [T, L] thành một số thực [R] với một số thuật toán tuân theo quy tắc và sau đó xếp hạng tất cả người chơi có giá trị [R].

Tuy nhiên, nếu sắp xếp ổn định là khả thi, thì bạn có thể chỉ cần sắp xếp toàn bộ danh sách theo [T] (người chơi nhanh hơn trước) và sau đó là [L]. Trong trường hợp này, thứ tự tương đối của người chơi (theo chi phí thời gian) sẽ không được thay đổi sau khi bạn nhóm chúng theo cấp độ mê cung mà họ đã làm sạch.

PS: tất nhiên cách tiếp cận để sắp xếp hai lần không phải là giải pháp tốt nhất cho vấn đề cụ thể nhưng để giải thích câu hỏi về poster thì nó là đủ.


0

Sắp xếp ổn định sẽ luôn trả về cùng một giải pháp (hoán vị) trên cùng một đầu vào.

Ví dụ [2.1,2] sẽ được sắp xếp bằng cách sử dụng sắp xếp ổn định dưới dạng hoán vị [2,1,3] (đầu tiên là chỉ số 2, sau đó chỉ mục 1 sau đó chỉ mục 3 trong đầu ra được sắp xếp) Điều đó có nghĩa là đầu ra luôn bị xáo trộn theo cách tương tự. Khác không ổn định, nhưng hoán vị đúng là [2,3,1].

Sắp xếp nhanh không phải là sắp xếp ổn định và sự khác biệt hoán vị giữa các yếu tố giống nhau phụ thuộc vào thuật toán để chọn trục. Một số triển khai nhận ngẫu nhiên và có thể sắp xếp nhanh chóng mang lại các hoán vị khác nhau trên cùng một đầu vào bằng cùng một thuật toán.

Thuật toán sắp xếp ổn định là cần thiết xác định.


2
Đó không phải là sự ổn định có nghĩa là gì. Xem en.wikipedia.org/wiki/Sorting_alerskym#Stability
Luís Oliveira

Tôi nên sửa câu cuối cùng so với sắp xếp không ổn định có thể đưa ra giải pháp khác nhau ngay cả trong cùng một triển khai, trong đó bất kỳ sắp xếp ổn định nào đều đưa ra giải pháp giống nhau.
Luka Rahne

1
Tại sao -1? Ai đó có thể chỉ ra những gì sai ở đây? Đây không phải là những gì sắp xếp ổn định, nhưng những gì thuộc tính ổn định thuộc tính có.
Luka Rahne

Việc sắp xếp có xác định hay không không xác định liệu nó có ổn định hay không. Tôi có thể viết một thuật toán sắp xếp xác định không ổn định bằng cách xác định một hành vi phá vỡ liên kết khác nhau (ví dụ bằng cách loại bỏ các phần không quan trọng). Sắp xếp ổn định ngụ ý cụ thể rằng thứ tự tương đối được sắp xếp trước của các yếu tố được bảo toàn khi các mối quan hệ được sắp xếp. ví dụ về đầu ra của một loại ổn định : sort([(5,3),(1,5),(3,3),(1,3)], x) => [(1,5),(1,3),(3,3),(5,3)]. Tôi có thể tạo ra một loại xác định luôn luôn xuất (xác định) đầu ra: [(1,3),(1,5),(3,3),(5,3)]nhưng đây không phải là một loại ổn định.
cowbert

@cowbert Đó là tuyên bố nhiều hơn, về tài sản tốt đẹp mà mọi loại ổn định có. Đó là không có vấn đề phù hợp với thuật toán sắp xếp ổn định hoặc thực hiện được sử dụng, mỗi lần sẽ có kết quả tương tự. Khó có thể duy trì tài sản như vậy trong số các triển khai sắp xếp không ổn định khác nhau.
Luka Rahne

0

Một số ví dụ khác về lý do muốn sắp xếp ổn định. Cơ sở dữ liệu là một ví dụ phổ biến. Lấy trường hợp của một cơ sở dữ liệu giao dịch hơn bao gồm họ | tên, ngày | thời gian mua, số mặt hàng, giá cả. Nói cơ sở dữ liệu thường được sắp xếp theo ngày | thời gian. Sau đó, một truy vấn được thực hiện để tạo một bản sao được sắp xếp của cơ sở dữ liệu theo họ | tên, vì một loại ổn định giữ nguyên thứ tự ban đầu, mặc dù so sánh truy vấn chỉ liên quan đến họ | tên, các giao dịch cho mỗi tên cuối cùng sẽ được trong dữ liệu | thứ tự thời gian.

Một ví dụ tương tự là Excel cổ điển, giới hạn sắp xếp thành 3 cột cùng một lúc. Để sắp xếp 6 cột, một sắp xếp được thực hiện với 3 cột ít quan trọng nhất, tiếp theo là sắp xếp với 3 cột quan trọng nhất.

Một ví dụ kinh điển về sắp xếp cơ số ổn định là một bộ sắp xếp thẻ, được sử dụng để sắp xếp theo một trường gồm 10 cột số cơ sở. Các thẻ được sắp xếp từ chữ số có nghĩa ít nhất đến chữ số có ý nghĩa nhất. Trên mỗi lượt đi, một cỗ bài được đọc và tách thành 10 thùng khác nhau theo chữ số trong cột đó. Sau đó, 10 thùng thẻ được đưa trở lại vào phễu đầu vào theo thứ tự (thẻ "0" trước, thẻ "9" cuối cùng). Sau đó, một đường chuyền khác được thực hiện bởi cột tiếp theo, cho đến khi tất cả các cột được sắp xếp. Bộ sắp xếp thẻ thực tế có hơn 10 thùng vì có 12 vùng trên thẻ, một cột có thể để trống và có một thùng đọc sai. Để sắp xếp các chữ cái, cần có 2 lượt cho mỗi cột, đường chuyền thứ nhất cho chữ số, đường chuyền thứ 2 cho vùng 12 11.

Sau này (1937) có các máy đối chiếu thẻ (sáp nhập) có thể hợp nhất hai cỗ bài bằng cách so sánh các trường. Đầu vào là hai bộ bài đã được sắp xếp, bộ bài chính và bộ bài cập nhật. Collator đã hợp nhất hai sàn thành một thùng mater mới và thùng lưu trữ, được sử dụng tùy ý cho các bản sao chính để thùng chính mới chỉ có thẻ cập nhật trong trường hợp trùng lặp. Đây có lẽ là cơ sở cho ý tưởng đằng sau sắp xếp hợp nhất (từ dưới lên).

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.