2009-09-29 41 views
54

Mã sau sắp xếp mảng này theo thứ tự số như thế nào?Cách sắp xếp của Javascript() hoạt động như thế nào?

var array=[25, 8, 7, 41] 

array.sort(function(a,b) { 
    return a - b}) 

Tôi biết rằng nếu kết quả của việc tính toán là ...

Ít hơn 0: "a" được sắp xếp để trở thành một chỉ số thấp hơn so với "b".
Zero: "a" và "b" được coi là bằng nhau và không có sắp xếp nào được thực hiện.
Lớn hơn 0: "b" được sắp xếp thành chỉ mục thấp hơn "a".

Chức năng gọi lại sắp xếp mảng có được gọi nhiều lần trong quá trình sắp xếp không?

Nếu vậy, tôi muốn biết hai số nào được chuyển vào hàm mỗi lần. Tôi cho rằng đầu tiên là "25" (a) và "8" (b), tiếp theo là "7" (a) và "41" (b), như vậy:

25 (a) - 8 (b) = 17 (lớn hơn 0, do đó, sắp xếp "b" thành chỉ mục thấp hơn "a"): 8, 25

7 (a) - 41 (b) = -34 (nhỏ hơn 0, do đó sắp xếp " một" là một chỉ số thấp hơn so với 'b':?! 7, 41

Làm thế nào là hai bộ số sau đó được sắp xếp trong quan hệ với nhau

Xin giúp một newbie đấu tranh

+1

Tôi hy vọng điều này làm cho một số cảm giác bị cắt xén! – cw84

Trả lời

32

Chức năng gọi lại sắp xếp mảng có được gọi nhiều lần trong quá trình sắp xếp không?

Nếu vậy, tôi muốn biết đó hai con số này được chuyển vào chức năng mỗi lần

Bạn có thể tìm hiểu tự của bạn với:

array.sort((a,b) => { 
    console.log(`comparing ${a},${b}`); 
    return a > b ? 1 
       : a === b ? 0 
         : -1; 
}); 

E DIT

Đây là sản phẩm tôi đã có:

25,8 
25,7 
8,7 
25,41 
+7

thay vì thực hiện một console.log thành phần tử firebug hoặc html DIV .innerHTML + = "compare" + a + "," + b + "\ n"; – Joshua

+0

@Joshua: Chắc chắn – OscarRyz

+2

Hãy nhớ rằng đây là trang web giống wiki và chúng tôi có thể chỉnh sửa các câu trả lời khác để cải thiện chúng :) –

3

Is arra y gọi lại chức năng gọi là nhiều lần trong quá trình sắp xếp?

Vâng, đúng vậy. Gọi lại được sử dụng để so sánh các cặp của các phần tử trong mảng khi cần thiết để xác định thứ tự chúng cần phải thực hiện. Việc thực hiện hàm so sánh đó không phải là điển hình khi đối phó với một kiểu số. Chi tiết trong the spec hoặc trên some các trang web khác more readable.

34

Trình thông dịch JavaScript có một số loại thực thi sort algorithm được tích hợp sẵn trong đó. Nó gọi hàm so sánh một số lần trong quá trình sắp xếp. Số lần hàm so sánh được gọi phụ thuộc vào thuật toán cụ thể, dữ liệu cần sắp xếp và thứ tự nó sắp xếp trước khi sắp xếp.

Một số thuật toán sắp xếp hoạt động kém trên các danh sách đã được sắp xếp bởi vì nó khiến chúng so sánh nhiều hơn so với trường hợp điển hình. Những người khác đối phó tốt với danh sách được sắp xếp trước, nhưng có những trường hợp khác mà họ có thể bị "lừa" để thực hiện kém.

Có nhiều thuật toán sắp xếp được sử dụng phổ biến vì không có thuật toán đơn nào là hoàn hảo cho mọi mục đích. Hai loại thường được sử dụng để phân loại chung là Quicksortmerge sort. Quicksort thường là nhanh hơn của hai, nhưng hợp nhất sắp xếp có một số thuộc tính tốt đẹp mà có thể làm cho nó một sự lựa chọn tổng thể tốt hơn. Hợp nhất sắp xếp là stable, trong khi Quicksort thì không. Cả hai thuật toán đều song song, nhưng cách phối hợp các công việc sắp xếp làm cho việc triển khai song song hiệu quả hơn, tất cả đều khác nhau.

Trình thông dịch JavaScript cụ thể của bạn có thể sử dụng một trong các thuật toán đó hoặc một số thuật toán khác hoàn toàn. Các tiêu chuẩn ECMAScriptdoes not specify which algorithm thực hiện phù hợp phải sử dụng. Nó thậm chí một cách rõ ràng từ chối sự cần thiết cho sự ổn định.

+1

FWIW, Quicksort cơ bản là một trong những thuật toán có thể bị "lừa" để hoạt động kém. Trong dạng đơn giản, nó có hiệu suất O (N^2) cho các danh sách đã được sắp xếp hoặc được đảo ngược chính xác. Hầu hết các thuật toán Quicksort của thư viện đều có một số tối ưu hóa không rõ ràng, giúp tránh những tình huống xấu nhất. – Adisak

+2

JavaScriptCore thực sự sử dụng một cây AVL để phân loại vì nó là cần thiết để hoạt động xác định khi đối mặt với các hàm so sánh sửa đổi mảng đang được sắp xếp. – olliej

9

cặp các giá trị được so sánh, một cặp tại một thời điểm. Các cặp được so sánh là một chi tiết triển khai - đừng cho rằng chúng sẽ giống nhau trên mọi trình duyệt. Gọi lại có thể là bất cứ điều gì (vì vậy bạn có thể sắp xếp chuỗi hoặc chữ số La Mã hoặc bất cứ điều gì khác mà bạn có thể đến với một hàm trả về 1,0, -1).

Một điều cần ghi nhớ với loại JavaScript là nó không được đảm bảo ổn định.

2

Chức năng gọi lại sắp xếp mảng có được gọi nhiều lần trong quá trình sắp xếp không?

Vì đây là một loại so sánh, với mục N, hàm gọi lại phải được gọi trung bình (N * Lg N) lần cho loại nhanh như Quicksort. Nếu thuật toán được sử dụng là một cái gì đó như Bubble Sort, thì hàm gọi lại sẽ được gọi vào thời gian trung bình (N * N).

Số lượng yêu cầu tối thiểu cho một loại so sánh là (N-1) và chỉ để phát hiện danh sách đã sắp xếp (tức là sớm trong Bubble Sort nếu không có sự hoán đổi).

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