2012-08-14 24 views
5

Tôi đã phát hiện ra rằng bên trong Array.Sort,.NET 4.0 thực hiện nội bộ của loại

[ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail), SecurityCritical] 
[MethodImpl(MethodImplOptions.InternalCall)] 
private static extern bool TrySZSort(Array keys, Array items, int left, int right); 

được gọi. Bất kỳ ý tưởng nào về cách triển khai này?

+0

Phương pháp đó được triển khai bằng mã gốc, do đó từ khóa 'extern'. Có thể được bao gồm trong nguồn tham chiếu ở đâu đó, nhưng trừ khi bạn chỉ tò mò muốn xem nó được triển khai như thế nào, nó có thể sẽ nhanh hơn bất cứ thứ gì bạn có thể viết trong mã được quản lý. –

+0

http://stackoverflow.com/questions/6842090/c-sharp-fastest-way-to-sort-an-array-in-descending-order – xandercoded

+0

Tôi tò mò vì QuickSort ngây thơ được gọi trừ khi Comparer mặc định được sử dụng. Vì vậy, điều đó có nghĩa là Array.Sort không đảm bảo trường hợp xấu nhất N * Log (N) ngay cả khi TrySZSort được gọi hay không. –

Trả lời

3

Bất kỳ ý tưởng nào về cách triển khai này?

Phương pháp đó được triển khai bằng mã gốc, nội bộ bên trong chính CLR. Có rất nhiều phương pháp như thế này trên chính cốt lõi, loại cấp thấp. Ví dụ: một số phương pháp trên System.String được gắn cờ InternalCall và được triển khai trong chính thời gian chạy ngôn ngữ chung.

+0

Có, tôi thấy rằng nó được thực hiện trong mã gốc. Nhưng loại nó ẩn đi: nhanh chóng, đống, hợp nhất, tim, vv? –

+2

@RomanDzhabarov QuickSort - Xem: http://msdn.microsoft.com/en-us/library/kwx6zbd4.aspx "Phương pháp này sử dụng thuật toán QuickSort". –

+1

Thông thường không chỉ là sắp xếp nhanh - dưới một mức nhất định mà nó chuyển sang sắp xếp chèn. Ngoài ra nếu nó thực hiện quá nhiều cuộc thám hiểm, nó chuyển sang heap sắp xếp tôi tin tưởng. Atlease visual studio C thư viện thời gian chạy sắp xếp những điều này. – Fakrudeen

11

Bạn có thể nhận được bản sao khá đáng tin cậy của mã nguồn CLR từ SSCLI20 source distribution. Nó đã được xuất bản vào năm 2005 và, vào thời điểm đó, là một bản sao khá chính xác của phiên bản CLR 2. Không bao giờ tìm thấy một sự khác biệt rõ ràng.

Điều đó được di chuyển kể từ đó, đã 7 năm trước và cập nhật phiên bản CLR khá lớn kể từ đó. Nhưng TrySZSort() vẫn còn xung quanh, những triển khai ở mức độ thấp này rất tự bảo tồn. Bạn sẽ tìm thấy nó khai báo trong clr/src/vm/ecall.cpp và ánh xạ tới ArrayHelper :: TrySZSort(), một phương pháp C++ khai báo trong clr/src/vm/arrayhelpers.cpp

Đó là trường hợp rất nhàm chán, nó chỉ gọi một phương thức lớp mẫu có tên là ArrayHelpers<T>.QuickSort(), chuyên biệt theo loại phần tử mảng cho các phần tử kiểu giá trị.

Đó chỉ là cách Tony Hoare viết lên 52 năm trước. Mặc dù không có trong C++;)

Bạn sẽ tìm thấy lý do mã này được viết bằng C++ chứ không phải trong C# trong this answer.

+0

Câu trả lời hay, cảm ơn. Unfortunatelly Tôi không thể đặt một số là tốt nhất. –

+0

Xem mã nguồn cho ArrayHelpers .QuickSort(): https://github.com/kasicass/sscli20/blob/dc64e12c9b835d4d373aa04978c0e8f1763b2e1b/clr/src/vm/comarrayhelpers.h#L77 –

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