2010-06-11 54 views
57

Tính ổn định của Array.sort trong các trình duyệt khác nhau là gì. Tôi biết rằng đặc tả của ECMA Script không chỉ định thuật toán nào sẽ sử dụng, cũng như không chỉ rõ loại sắp xếp có ổn định hay không.Array.sort Sắp xếp tính ổn định trong các trình duyệt khác nhau

Tôi đã tìm thấy thông tin này cho Firefox tại https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Array/sort chỉ định rằng firefox sử dụng sắp xếp ổn định.

Có ai biết về IE 6/7/8, Chrome, Safari không?

Trả lời

53

Simple test case (bỏ qua tiêu đề, tập hợp số thứ hai sẽ được tuần tự nếu sắp xếp của động cơ ổn định).

Loại IE đã ổn định miễn là tôi từng sử dụng nó (vì vậy IE6). Kiểm tra lại trong IE8 và nó vẫn xuất hiện.

Và mặc dù trang Mozilla bạn liên kết để nói rằng sắp xếp của Firefox là ổn định, tôi chắc chắn nói điều này không phải lúc nào cũng là trường hợp trước (và bao gồm) Firefox 2.0.

Một số kết quả lướt qua:

  • IE6 +: ổn định
  • Firefox < 3: ổn định
  • Firefox> = 3: ổn định
  • Chrome < = 5 (tức là, tất cả các phiên bản cho đến nay): không ổn định
  • Opera < 10: không ổn định
  • Opera> = 10: ổn định
  • Safari 4: ổn định

Tất cả các bài kiểm tra trên Windows.

Xem thêm:

+9

Sẽ rất hữu ích nếu giữ cập nhật này. – ColBeseder

+0

Có vẻ như Chrome (V8) sẽ giữ nguyên cách này: http://code.google.com/p/v8/issues/detail?id=90 –

+1

http://ofb.net/~sethml/is-sort-stable .html? (Tôi đã lưu nó trên lưu trữ web chỉ trong trường hợp) – Pierre

-2

Nếu bạn đang tìm kiếm danh sách các trình duyệt mà bạn nên sử dụng thuật toán sắp xếp không phải gốc, đề xuất của tôi là không.

Thay vào đó, hãy kiểm tra sanity sắp xếp khi tập lệnh tải và đưa ra quyết định của bạn từ đó.

Vì thông số kỹ thuật không yêu cầu một hành vi cụ thể trong vấn đề đó, nó không miễn dịch với thay đổi sau này, ngay cả trong cùng một dòng trình duyệt.

Bạn có thể gửi bản vá cho http://www.browserscope.org/ để bao gồm các kiểm tra như vậy trong bộ phần mềm của họ. Nhưng một lần nữa, tính năng phát hiện vượt trội so với phát hiện trình duyệt.

+9

Tôi không chắc chắn nếu bạn có thể viết một kiểm tra sanity rằng sẽ đảm bảo một loại ổn định. Nó có thể xuất hiện ổn định một lúc nhưng sau đó không ổn định tiếp theo. Điều này có thể xảy ra, ví dụ, nếu phân loại bằng cách nào đó dựa vào vị trí của các đối tượng JavaScript trong bộ nhớ - cái gì đó có thể là không thể đoán trước. –

+1

@RichDougherty - Tôi chắc chắn bạn * không thể *. Bạn không thể chứng minh một thuật toán sắp xếp ổn định bằng cách chạy nó! Điều đó sẽ giống như cố gắng chứng minh một chiếc xe đáng tin cậy bằng cách lái nó một lần quanh khối. Bạn phải phân tích thuật toán và thực hiện. – Malvolio

+0

@Malvolio, tôi nghĩ chúng tôi đồng ý. Tôi đã nói rằng nếu một bài kiểm tra vượt qua bây giờ thì chắc chắn nó không được đảm bảo để vượt qua trong tương lai, do đó vô ích của việc kiểm tra thời gian tải cho sự ổn định. –

12

Tôi muốn chia sẻ một mẹo mà tôi thường sử dụng trong C/C++ cho qsort().

JS 'sort() cho phép chỉ định hàm so sánh. Tạo mảng thứ hai có cùng độ dài và điền nó với số tăng từ 0.

function stableSorted(array, compareFunction) { 
    compareFunction = compareFunction || defaultCompare; 
    var indicies = new Array(array.length); 
    for (var i = 0; i < indicies.length; i++) 
    indicies[i] = i; 

Đây là chỉ mục vào mảng ban đầu. Chúng ta sẽ sắp xếp mảng thứ hai. Tạo một hàm so sánh tùy chỉnh.

indicies.sort(function(a, b)) { 

Nó sẽ lấy hai phần tử từ mảng thứ hai: sử dụng chúng làm chỉ mục vào mảng ban đầu và so sánh các phần tử.

var aValue = array[a], bValue = array[b]; 
    var order = compareFunction(a, b); 
    if (order != 0) 
     return order; 

Nếu các thành phần có thể bằng nhau, thì hãy so sánh các chỉ số của chúng để ổn định đơn đặt hàng.

if (a < b) 
    return -1; 
    else 
    return 1; 
    }); 

Sau khi sort(), mảng thứ hai sẽ chứa chỉ số mà bạn có thể sử dụng để truy cập vào các phần tử của mảng ban đầu trong ổn định trật tự sắp xếp.

var sorted = new Array(array.length); 
    for (var i = 0; i < sorted.length; i++) 
    sorted[i] = array[indicies[i]]; 
    return sorted; 
} 

// The default comparison logic used by Array.sort(), if compareFunction is not provided: 
function defaultCompare(a, b) { 
    a = String(a); 
    b = String(b); 
    if (a < b) return -1; 
    else if (a > b) return 1; 
    else return 0; 
} 

Nói chung, thuật toán sắp xếp ổn định chỉ trưởng thành và vẫn cần thêm bộ nhớ bổ sung so với qsort tốt. Tôi đoán đó là lý do tại sao rất ít thông số kỹ thuật ủy nhiệm sắp xếp ổn định.

Các vấn đề liên quan