Hướng dẫn how fast is sort () in python? - sort () trong python nhanh như thế nào?
@Fmark Một số điểm chuẩn của việc thực hiện Python Merge-Sort mà tôi đã viết chống lại Python Quicksorts từ http://rosettacode.org/wiki/sorting_algorithms/quicksort#python và từ câu trả lời hàng đầu. Show
Hợp nhất sắp xếp chiến thắng, tuy nhiên nó sử dụng tích hợp int () cho sàn Xem, trong lập trình có một khái niệm về sự phức tạp. Thuật toán của bạn - Sắp xếp bong bóng, có độ phức tạp được ghi nhận là 6, có nghĩa là, khi độ dài của danh sách 7 tăng lên, thời gian cần có đa thức theo cấp số nhân ( 8). Sắp xếp bong bóng có một trong những phức tạp tồi tệ nhất (danh sách các thuật toán và sự phức tạp của chúng).Như bạn có thể thấy trong liên kết ở trên, có các thuật toán tốt hơn. Có những cái "tuyến tính" ( 9, 7 tỷ lệ thuận với thời gian cần thiết để tính toán với thuật toán này) và sau đó chúng ta có 1. Bạn có thể google một [đồ thị] (https://www.google.pl/search?q=f (x)+%3D+log (x)) của sự phức tạp này, về cơ bản cho thấy điều này - 7 cao hơn là chậm hơn nó phát triển.Nó là khá hợp lý khi cho rằng 1 là một trong những điều tốt nhất có thể. Hãy thử tìm một thuật toán mà bạn thấy dễ hiểu và thực hiện nó (Wikipedia chủ yếu nên có việc triển khai mã giả)Chỉnh sửa: Typo Xem bây giờ hướng dẫn này có một khóa học video liên quan được tạo bởi nhóm Python thực sự. Xem cùng với hướng dẫn bằng văn bản để hiểu sâu hơn về sự hiểu biết của bạn: Giới thiệu về các thuật toán sắp xếp trong Python This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Introduction to Sorting Algorithms in Python Chức năng sắp xếp Python có nhanh không? is a basic building block that many other algorithms are built upon. It’s related to several exciting ideas that you’ll see throughout your programming career. Understanding how sorting algorithms in Python work behind the scenes is a fundamental step toward implementing correct and efficient algorithms that solve real-world problems. Thời gian thực hiện Sắp xếp hợp nhất của bạn so với sắp xếp bong bóng và sắp xếp chèn, việc triển khai Sắp xếp hợp nhất là cực kỳ nhanh, sắp xếp mảng mười nghìn phần tử trong chưa đầy một giây!
Phương pháp sắp xếp nào là nhanh nhất? Nếu bạn đã quan sát, độ phức tạp thời gian của QuickSort là O (N logn) trong các trường hợp tốt nhất và trung bình và O (n^2) trong trường hợp xấu nhất. Nhưng vì nó có ưu thế trong các trường hợp trung bình đối với hầu hết các đầu vào, Quicksort thường được coi là thuật toán sắp xếp nhanh nhất trên mạng.Sắp xếp là một khối xây dựng cơ bản mà nhiều thuật toán khác được xây dựng. Nó có liên quan đến một số ý tưởng thú vị mà bạn sẽ thấy trong suốt sự nghiệp lập trình của mình. Hiểu cách sắp xếp các thuật toán trong Python hoạt động đằng sau hậu trường là một bước cơ bản để thực hiện các thuật toán chính xác và hiệu quả để giải quyết các vấn đề trong thế giới thực. Trong hướng dẫn này, bạn sẽ học:
Từ các ứng dụng thương mại đến nghiên cứu học thuật và ở mọi nơi ở giữa, có vô số cách bạn có thể sử dụng phân loại để tiết kiệm thời gian và công sức của mình. Thuật toán sắp xếp tích hợp PythonNgôn ngữ Python, giống như nhiều ngôn ngữ lập trình cấp cao khác, cung cấp khả năng sắp xếp dữ liệu ra khỏi hộp bằng 5. Ở đây, một ví dụ về việc sắp xếp một mảng số nguyên:>>>
Bạn có thể sử dụng 5 để sắp xếp bất kỳ danh sách nào miễn là các giá trị bên trong có thể so sánh được.Tầm quan trọng của độ phức tạp thời gianHướng dẫn này bao gồm hai cách khác nhau để đo thời gian chạy của các thuật toán sắp xếp:runtime of sorting algorithms:
Thời gian mã của bạnKhi so sánh hai thuật toán sắp xếp trong Python, nó luôn luôn có nhiều thông tin để xem mỗi người mất bao lâu để chạy. Thời gian cụ thể, mỗi thuật toán sẽ được xác định một phần bởi phần cứng của bạn, nhưng bạn vẫn có thể sử dụng thời gian tỷ lệ giữa các lần thực hiện để giúp bạn quyết định triển khai nào hiệu quả hơn về thời gian. Trong phần này, bạn sẽ tập trung vào một cách thực tế để đo thời gian thực tế để chạy đến các thuật toán sắp xếp của bạn bằng mô -đun 4. Để biết thêm thông tin về các cách khác nhau, bạn có thể thời gian thực hiện mã trong Python, hãy xem các chức năng của Timer Python: Ba cách để theo dõi mã của bạn.Ở đây, một chức năng bạn có thể sử dụng để thời gian thuật toán của mình:
Trong ví dụ này, 9 nhận được tên của thuật toán và mảng đầu vào cần được sắp xếp. Ở đây, một lời giải thích từng dòng về cách thức hoạt động:
Ở đây, một ví dụ về cách sử dụng 9 để xác định thời gian cần thiết để sắp xếp một mảng gồm mười nghìn giá trị số nguyên bằng cách sử dụng 5:
Nếu bạn lưu mã trên trong tệp 5, thì bạn có thể chạy nó từ thiết bị đầu cuối và xem đầu ra của nó:
Hãy nhớ rằng thời gian tính bằng giây của mỗi thử nghiệm phụ thuộc một phần vào phần cứng bạn sử dụng, do đó, bạn có thể sẽ thấy kết quả hơi khác nhau khi chạy mã. Đo lường hiệu quả với ký hiệu O lớnThời gian cụ thể mà một thuật toán cần để chạy isn không đủ thông tin để có được bức tranh đầy đủ về độ phức tạp của thời gian của nó. Để giải quyết vấn đề này, bạn có thể sử dụng ký hiệu Big O (phát âm là OH OH). Big O thường được sử dụng để so sánh các triển khai khác nhau và quyết định xem cái nào là hiệu quả nhất, bỏ qua các chi tiết không cần thiết và tập trung vào những gì quan trọng nhất trong thời gian chạy của thuật toán.time complexity. To solve this problem, you can use Big O (pronounced “big oh”) notation. Big O is often used to compare different implementations and decide which one is the most efficient, skipping unnecessary details and focusing on what’s most important in the runtime of an algorithm. Thời gian tính bằng giây cần thiết để chạy các thuật toán khác nhau có thể bị ảnh hưởng bởi một số yếu tố không liên quan, bao gồm tốc độ bộ xử lý hoặc bộ nhớ có sẵn. Big O, mặt khác, cung cấp một nền tảng để thể hiện độ phức tạp thời gian chạy về mặt bất khả tri phần cứng. Với Big O, bạn thể hiện sự phức tạp về mức độ thời gian chạy của thuật toán của bạn phát triển nhanh như thế nào so với kích thước của đầu vào, đặc biệt là khi đầu vào phát triển tùy ý lớn. Giả sử rằng N là kích thước của đầu vào cho một thuật toán, ký hiệu O lớn đại diện cho mối quan hệ giữa N và số bước mà thuật toán thực hiện để tìm giải pháp. Big O sử dụng một chữ cái viết hoa, sau đó là mối quan hệ này bên trong ngoặc đơn. Ví dụ: O (n) đại diện cho các thuật toán thực hiện một số bước tỷ lệ thuận với kích thước của đầu vào của chúng.O(n) represents algorithms that execute a number of steps proportional to the size of their input. Mặc dù hướng dẫn này sẽ không đi sâu vào các chi tiết về ký hiệu Big O, nhưng đây là năm ví dụ về độ phức tạp thời gian chạy của các thuật toán khác nhau:
Hướng dẫn này bao gồm độ phức tạp thời gian chạy O của từng thuật toán sắp xếp được thảo luận. Nó cũng bao gồm một lời giải thích ngắn gọn về cách xác định thời gian chạy trên từng trường hợp cụ thể. Điều này sẽ cho bạn hiểu rõ hơn về cách bắt đầu sử dụng Big O để phân loại các thuật toán khác. Thuật toán sắp xếp bong bóng trong pythonSắp xếp bong bóng là một trong những thuật toán sắp xếp đơn giản nhất. Tên của nó xuất phát từ cách thức hoạt động của thuật toán: với mỗi lần vượt qua mới, yếu tố lớn nhất trong danh sách Bong bóng bong bóng lên trên vị trí chính xác của nó. is one of the most straightforward sorting algorithms. Its name comes from the way the algorithm works: With every new pass, the largest element in the list “bubbles up” toward its correct position. Sắp xếp bong bóng bao gồm thực hiện nhiều đường chuyền qua một danh sách, so sánh từng yếu tố một và hoán đổi các mục liền kề không có thứ tự. Thực hiện phân loại bong bóng trong PythonỞ đây, một việc thực hiện thuật toán sắp xếp bong bóng trong Python:
Vì việc triển khai này sắp xếp mảng theo thứ tự tăng dần, mỗi bước bong bóng, thành phần lớn nhất đến cuối mảng. Điều này có nghĩa là mỗi lần lặp có ít các bước hơn so với lần lặp trước vì một phần lớn hơn của mảng được sắp xếp. Các vòng lặp trong dòng 4 và 10 xác định cách thuật toán chạy qua danh sách. Lưu ý cách 6 ban đầu đi từ phần tử đầu tiên trong danh sách đến phần tử ngay trước phần cuối. Trong lần lặp thứ hai, 6 chạy cho đến hai mục từ cuối cùng, sau đó ba mục từ cuối cùng, v.v. Vào cuối mỗi lần lặp, phần cuối của danh sách sẽ được sắp xếp.lines 4 and 10 determine the way the algorithm runs through the list. Notice how 6 initially goes from the first element in the list to the element immediately before the last. During the second iteration, 6 runs until two items from the last, then three items from the last, and so on. At the end of each iteration, the
end portion of the list will be sorted.Khi các vòng lặp tiến triển, dòng 15 so sánh từng phần tử với giá trị liền kề của nó và dòng 18 hoán đổi chúng nếu chúng theo thứ tự không chính xác. Điều này đảm bảo một danh sách được sắp xếp ở cuối hàm.line 15 compares each element with its adjacent value, and line 18 swaps them if they are in the incorrect order. This ensures a sorted list at the end of the function. Để phân tích chính xác cách thức hoạt động của thuật toán, hãy xem xét một danh sách với các giá trị 8. Giả sử bạn sử dụng 9 từ trên cao. Dưới đây, một con số minh họa cho mảng trông như thế nào ở mỗi lần lặp của thuật toán:
Quá trình sắp xếp bong bóngBây giờ hãy xem xét từng bước về những gì mà xảy ra với mảng khi thuật toán tiến triển:
Đo lường độ phức tạp thời gian chạy của Bubble sắp xếpViệc thực hiện phân loại bong bóng của bạn bao gồm hai vòng 1 lồng nhau trong đó thuật toán thực hiện so sánh n - 1, sau đó so sánh n - 2, v.v. cho đến khi so sánh cuối cùng được thực hiện. Điều này có tổng cộng (n - 1) + (n - 2) + (n - 3) + + + 2 + 1 = n (n -1)/2 so sánh, cũng có thể được viết là ½n2 - ½n.Bạn đã học được trước đó rằng Big O tập trung vào cách thời gian chạy phát triển so với kích thước của đầu vào. Điều đó có nghĩa là, để biến phương trình trên thành độ phức tạp o lớn của thuật toán, bạn cần loại bỏ các hằng số vì chúng không thay đổi với kích thước đầu vào. Làm như vậy đơn giản hóa ký hiệu thành N2 - n. Vì N2 phát triển nhanh hơn nhiều so với N, nên thuật ngữ cuối cùng này cũng có thể được giảm, để lại sự sắp xếp bong bóng với độ phức tạp trung bình và trường hợp xấu nhất của O (N2).O(n2). Trong trường hợp thuật toán nhận được một mảng đã được sắp xếp và giả sử việc triển khai bao gồm tối ưu hóa cờ ____72 được giải thích trước khi độ phức tạp thời gian chạy sẽ giảm xuống (n) tốt hơn nhiều vì thuật toán sẽ không cần truy cập vào bất kỳ phần tử nào hơn là nhiều hơn Một lần. O (n), sau đó, là độ phức tạp thời gian chạy trong trường hợp tốt nhất của loại bong bóng. Nhưng hãy nhớ rằng các trường hợp tốt nhất là một ngoại lệ và bạn nên tập trung vào trường hợp trung bình khi so sánh các thuật toán khác nhau. Thời gian thực hiện sắp xếp bong bóng của bạnSử dụng 9 của bạn từ trước đó trong hướng dẫn này, ở đây, thời gian sắp xếp bong bóng để xử lý một mảng với mười nghìn mặt hàng. Dòng 8 thay thế tên của thuật toán và mọi thứ khác vẫn giữ nguyên:Line 8 replaces the name of the algorithm and everything else stays the same:
Bây giờ bạn có thể chạy tập lệnh để có thời gian thực hiện là 4:
Phải mất 5 giây để sắp xếp mảng với mười nghìn yếu tố. Điều này thể hiện sự thực hiện nhanh nhất trong số mười lần lặp lại mà 9 chạy. Thực hiện tập lệnh này nhiều lần sẽ tạo ra kết quả tương tự.Phân tích điểm mạnh và điểm yếu của loại bong bóngƯu điểm chính của thuật toán sắp xếp bong bóng là sự đơn giản của nó. Nó là đơn giản để cả thực hiện và hiểu. Đây có lẽ là lý do chính tại sao hầu hết các khóa học khoa học máy tính giới thiệu chủ đề sắp xếp bằng cách sử dụng loại bong bóng.simplicity. It is straightforward to both implement and understand. This is probably the main reason why most computer science courses introduce the topic of sorting using bubble sort. Như bạn đã thấy trước đây, nhược điểm của loại bong bóng là nó chậm, với độ phức tạp thời gian chạy của O (N2). Thật không may, điều này quy định nó như một ứng cử viên thực tế để sắp xếp các mảng lớn.slow, with a runtime complexity of O(n2). Unfortunately, this rules it out as a practical candidate for sorting large arrays. Thuật toán loại chèn trong pythonGiống như sắp xếp bong bóng, thuật toán loại chèn rất đơn giản để thực hiện và hiểu. Nhưng không giống như Sắp xếp bong bóng, nó xây dựng danh sách được sắp xếp một phần tử tại một thời điểm bằng cách so sánh từng mục với phần còn lại của danh sách và chèn nó vào vị trí chính xác của nó. Quy trình chèn này của người Viking này cung cấp cho thuật toán tên của nó.insertion sort algorithm is straightforward to implement and understand. But unlike bubble sort, it builds the sorted list one element at a time by comparing each item with the rest of the list and inserting it into its correct position. This “insertion” procedure gives the algorithm its name. Một sự tương tự tuyệt vời để giải thích loại chèn là cách bạn sắp xếp một bộ bài. Hãy tưởng tượng rằng bạn đang cầm một nhóm thẻ trong tay và bạn muốn sắp xếp chúng theo thứ tự. Bạn bắt đầu bằng cách so sánh một thẻ duy nhất từng bước với phần còn lại của thẻ cho đến khi bạn tìm thấy vị trí chính xác của nó. Tại thời điểm đó, bạn đã chèn thẻ ở vị trí chính xác và bắt đầu lại với một thẻ mới, lặp lại cho đến khi tất cả các thẻ trong tay bạn được sắp xếp. Thực hiện sắp xếp chèn trong PythonThuật toán sắp xếp chèn hoạt động chính xác giống như ví dụ với bộ bài của thẻ. Ở đây, việc thực hiện trong Python:
Không giống như sắp xếp bong bóng, việc triển khai loại chèn này xây dựng danh sách được sắp xếp bằng cách đẩy các mục nhỏ hơn sang trái. Hãy cùng phá vỡ dòng 7 từng dòng:
Dưới đây, một con số minh họa các lần lặp khác nhau của thuật toán khi sắp xếp mảng 8:Quy trình sắp xếp chènBây giờ ở đây, một bản tóm tắt các bước của thuật toán khi sắp xếp mảng:
Đo lường chèn sắp xếp độ phức tạp thời gian chạy o lớnTương tự như triển khai Sắp xếp bong bóng của bạn, thuật toán sắp xếp chèn có một vài vòng lặp lồng nhau đi qua danh sách. Vòng bên trong khá hiệu quả vì nó chỉ đi qua danh sách cho đến khi nó tìm thấy vị trí chính xác của một phần tử. Điều đó nói rằng, thuật toán vẫn có độ phức tạp thời gian chạy O (N2) trên trường hợp trung bình.O(n2) runtime complexity on the average case. Trường hợp xấu nhất xảy ra khi mảng được cung cấp được sắp xếp theo thứ tự ngược lại. Trong trường hợp này, vòng lặp bên trong phải thực hiện mọi so sánh để đặt mọi yếu tố vào vị trí chính xác của nó. Điều này vẫn cung cấp cho bạn độ phức tạp thời gian chạy O (N2). Trường hợp tốt nhất xảy ra khi mảng được cung cấp đã được sắp xếp. Ở đây, vòng lặp bên trong không bao giờ được thực hiện, dẫn đến độ phức tạp thời gian chạy O (n), giống như trường hợp tốt nhất của loại bong bóng. Mặc dù sắp xếp bong bóng và sắp xếp chèn có cùng độ phức tạp thời gian chạy O lớn, nhưng trong thực tế, loại chèn có hiệu quả hơn đáng kể so với sắp xếp bong bóng. Nếu bạn nhìn vào việc triển khai cả hai thuật toán, thì bạn có thể thấy cách sắp xếp chèn phải thực hiện ít so sánh hơn để sắp xếp danh sách. Thời gian thực hiện sắp xếp chèn của bạnĐể chứng minh khẳng định rằng loại chèn hiệu quả hơn so với sắp xếp bong bóng, bạn có thể theo thời gian thuật toán loại chèn và so sánh nó với kết quả sắp xếp bong bóng. Để làm điều này, bạn chỉ cần thay thế cuộc gọi đến 9 bằng tên của việc thực hiện loại chèn của bạn:
Bạn có thể thực thi tập lệnh như trước: 0Lưu ý cách triển khai sắp xếp chèn mất khoảng 04 ít giây so với triển khai sắp xếp bong bóng để sắp xếp cùng một mảng. Mặc dù chúng là cả hai thuật toán O (N2), sắp xếp chèn hiệu quả hơn.Phân tích điểm mạnh và điểm yếu của sự sắp xếp chènGiống như sắp xếp bong bóng, thuật toán loại chèn rất không phức tạp để thực hiện. Mặc dù sắp xếp chèn là thuật toán O (N2), nhưng nó cũng hiệu quả hơn nhiều trong thực tế so với các triển khai bậc hai khác như sắp xếp bong bóng. Có nhiều thuật toán mạnh mẽ hơn, bao gồm cả Merge sắp xếp và Quicksort, nhưng các triển khai này là đệ quy và thường không đánh bại sắp xếp chèn khi làm việc trên các danh sách nhỏ. Một số triển khai QuickSort thậm chí sử dụng chèn sắp xếp nội bộ nếu danh sách đủ nhỏ để cung cấp triển khai tổng thể nhanh hơn. TimSort cũng sử dụng chèn sắp xếp bên trong để sắp xếp các phần nhỏ của mảng đầu vào.Timsort also uses insertion sort internally to sort small portions of the input array. Điều đó nói rằng, loại chèn là không thực tế cho các mảng lớn, mở ra cánh cửa cho các thuật toán có thể mở rộng theo những cách hiệu quả hơn. Thuật toán sắp xếp hợp nhất trong PythonSắp xếp hợp nhất là một thuật toán sắp xếp rất hiệu quả. Nó dựa trên cách tiếp cận phân chia và chinh phục, một kỹ thuật thuật toán mạnh mẽ được sử dụng để giải quyết các vấn đề phức tạp. is a very efficient sorting algorithm. It’s based on the divide-and-conquer approach, a powerful algorithmic technique used to solve complex problems. Để hiểu đúng sự phân chia và chinh phục, trước tiên bạn nên hiểu khái niệm đệ quy. Recursion liên quan đến việc phá vỡ một vấn đề thành các vấn đề nhỏ hơn cho đến khi chúng đủ nhỏ để quản lý. Trong lập trình, đệ quy thường được thể hiện bằng một hàm tự gọi.recursion. Recursion involves breaking a problem down into smaller subproblems until they’re small enough to manage. In programming, recursion is usually expressed by a function calling itself. Các thuật toán chia và chinh phục thường theo cùng một cấu trúc:
Trong trường hợp sắp xếp hợp nhất, cách tiếp cận phân chia và chinh phục chia tập hợp các giá trị đầu vào thành hai phần có kích thước bằng nhau, sắp xếp từng nửa một nửa và cuối cùng hợp nhất hai phần được sắp xếp này thành một danh sách được sắp xếp. Thực hiện Sắp xếp hợp nhất trong PythonViệc thực hiện thuật toán sắp xếp hợp nhất cần hai phần khác nhau:
Tại đây, mã để hợp nhất hai mảng khác nhau: 1 05 nhận được hai mảng được sắp xếp khác nhau cần được hợp nhất với nhau. Quá trình để thực hiện điều này là đơn giản:
Với chức năng ở trên, phần còn thiếu duy nhất là một hàm chia nhỏ mảng đầu vào và sử dụng 05 để tạo ra kết quả cuối cùng: 2Ở đây, một bản tóm tắt nhanh chóng về mã:
Lưu ý cách chức năng này tự gọi mình là đệ quy, giảm một nửa mảng mỗi lần. Mỗi lần lặp lại liên quan đến một mảng không bao giờ thu hút cho đến khi vẫn còn ít hơn hai yếu tố, có nghĩa là không còn gì để sắp xếp. Tại thời điểm này, 05 tiếp quản, hợp nhất hai nửa và tạo ra một danh sách được sắp xếp.recursively, halving the array each time. Each iteration deals with an ever-shrinking array until fewer than two elements remain, meaning there’s nothing left to sort. At this point, 05 takes over, merging the two halves and producing a sorted list.Hãy xem một đại diện của các bước mà hợp nhất sắp xếp sẽ thực hiện để sắp xếp mảng 8:Quy trình sắp xếp hợp nhấtCon số sử dụng mũi tên màu vàng để biểu diễn một nửa mảng ở mỗi cấp độ đệ quy. Các mũi tên màu xanh lá cây đại diện cho việc hợp nhất mỗi Subarray trở lại với nhau. Các bước có thể được tóm tắt như sau:
Đo lường sự phức tạp của Merge sắp xếp oĐể phân tích sự phức tạp của Sắp xếp hợp nhất, bạn có thể nhìn vào hai bước của nó một cách riêng biệt:
Thật thú vị, O (n log2n) là thời gian chạy trong trường hợp xấu nhất có thể có thể đạt được bằng thuật toán sắp xếp. Thời gian thực hiện sắp xếp hợp nhất của bạnĐể so sánh tốc độ hợp nhất sắp xếp với hai triển khai trước đó, bạn có thể sử dụng cùng một cơ chế như trước đây và thay thế tên của thuật toán trong dòng 8:line 8: 3Bạn có thể thực thi tập lệnh để có thời gian thực hiện là 43: 4So với sắp xếp bong bóng và sắp xếp chèn, việc triển khai Merge sắp xếp cực kỳ nhanh, sắp xếp mảng mười nghìn phần tử trong chưa đầy một giây! Phân tích điểm mạnh và điểm yếu của sự hợp nhấtNhờ độ phức tạp thời gian chạy của O (n log2N), Merge Sort là một thuật toán rất hiệu quả, có tỷ lệ tốt như kích thước của mảng đầu vào phát triển. Nó cũng đơn giản để song song hóa vì nó chia mảng đầu vào thành các khối có thể được phân phối và xử lý song song nếu cần thiết.parallelize because it breaks the input array into chunks that can be distributed and processed in parallel if necessary. Điều đó nói rằng, đối với các danh sách nhỏ, chi phí thời gian của đệ quy cho phép các thuật toán như sắp xếp bong bóng và sắp xếp chèn nhanh hơn. Ví dụ: chạy thử nghiệm với danh sách mười yếu tố dẫn đến các thời điểm sau: 5Cả hai loại bong bóng và chèn sắp xếp Beat Merge sắp xếp khi sắp xếp một danh sách mười phần tử. Một nhược điểm khác của Sắp xếp hợp nhất là nó tạo ra các bản sao của mảng khi tự gọi mình là đệ quy. Nó cũng tạo ra một danh sách mới bên trong 05 để sắp xếp và trả lại cả hai nửa đầu vào. Điều này làm cho Sắp xếp hợp nhất sử dụng nhiều bộ nhớ hơn so với sắp xếp bong bóng và sắp xếp chèn, cả hai đều có thể sắp xếp danh sách tại chỗ.Do giới hạn này, bạn có thể không muốn sử dụng Merge sắp xếp để sắp xếp các danh sách lớn trong phần cứng bị hạn chế bộ nhớ. Thuật toán Quicksort trong PythonGiống như Merge sắp xếp, thuật toán QuickSort áp dụng nguyên tắc phân chia và chinh phục để chia mảng đầu vào thành hai danh sách, thứ nhất với các mục nhỏ và thứ hai với các mục lớn. Thuật toán sau đó sắp xếp cả hai danh sách đệ quy cho đến khi danh sách kết quả được sắp xếp hoàn toàn.Quicksort algorithm applies the divide-and-conquer principle to divide the input array into two lists, the first with small items and the second with large items. The algorithm then sorts both lists recursively until the resultant list is completely sorted. Chia danh sách đầu vào được gọi là phân vùng danh sách. QuickSort trước tiên chọn một phần tử 45 và phân vùng danh sách xung quanh 45, đặt mọi phần tử nhỏ hơn vào một mảng 47 và mọi phần tử lớn hơn vào một mảng 48.partitioning the list. Quicksort first selects a 45 element and partitions the list around the 45, putting every smaller element into a 47 array and every larger element into a 48 array.Đặt mọi yếu tố từ danh sách 47 vào bên trái của 45 và mọi yếu tố từ danh sách 48 đến đúng vị trí 45 chính xác để có trong danh sách được sắp xếp cuối cùng. Điều này có nghĩa là chức năng hiện có thể áp dụng quy trình tương tự một cách đệ quy cho 47 và sau đó 48 cho đến khi toàn bộ danh sách được sắp xếp.Thực hiện Quicksort trong PythonTại đây, một triển khai khá nhỏ gọn của Quicksort: 6Ở đây, một bản tóm tắt của mã:
Ở đây, một minh họa về các bước mà QuickSort thực hiện để sắp xếp mảng 8:Quá trình QuicksortCác đường màu vàng biểu thị phân vùng của mảng thành ba danh sách: 47, 59 và 48. Các đường màu xanh lá cây đại diện cho việc sắp xếp và đặt các danh sách này lại với nhau. Ở đây, một lời giải thích ngắn gọn về các bước:
Chọn phần tử >>> array = [8, 2, 6, 4, 5] >>> sorted(array) [2, 4, 5, 6, 8] 45Tại sao việc triển khai ở trên chọn phần tử 45 một cách ngẫu nhiên? Sẽ là giống nhau để nhất quán chọn phần tử đầu tiên hoặc cuối cùng của danh sách đầu vào?Do cách thức hoạt động của thuật toán Quicksort, số lượng cấp độ đệ quy phụ thuộc vào nơi 45 kết thúc trong mỗi phân vùng. Trong trường hợp tốt nhất, thuật toán luôn chọn phần tử trung bình là 45. Điều đó sẽ làm cho mỗi biểu tượng được tạo ra chính xác bằng một nửa của vấn đề trước đó, dẫn đến nhiều cấp độ log2N.median element as the 45. That would make each generated subproblem exactly half the size of the previous problem, leading to at most log2n levels. Mặt khác, nếu thuật toán luôn chọn phần tử nhỏ nhất hoặc lớn nhất của mảng là 45, thì các phân vùng được tạo sẽ không bằng nhau nhất có thể, dẫn đến mức độ đệ quy N-1. Đó sẽ là kịch bản trường hợp xấu nhất cho Quicksort.Như bạn có thể thấy, hiệu quả của QuickSort, thường phụ thuộc vào lựa chọn 45. Nếu mảng đầu vào chưa được phân loại, thì sử dụng phần tử đầu tiên hoặc cuối cùng vì 45 sẽ hoạt động giống như một phần tử ngẫu nhiên. Nhưng nếu mảng đầu vào được sắp xếp hoặc gần như được sắp xếp, sử dụng phần tử đầu tiên hoặc cuối cùng vì 45 có thể dẫn đến một trường hợp xấu nhất. Chọn 45 một cách ngẫu nhiên khiến cho nhiều khả năng QuickSort sẽ chọn một giá trị gần với trung bình và kết thúc nhanh hơn.Một tùy chọn khác để chọn 45 là tìm giá trị trung bình của mảng và buộc thuật toán sử dụng nó làm 45. Điều này có thể được thực hiện trong thời gian O (N). Mặc dù quá trình này có liên quan nhiều hơn một chút, nhưng sử dụng giá trị trung bình làm 45 cho Quicksort đảm bảo bạn sẽ có kịch bản O tốt nhất.Đo lường sự phức tạp của Quicksort từ OVới QuickSort, danh sách đầu vào được phân vùng theo thời gian tuyến tính, O (n) và quá trình này lặp lại đệ quy một trung bình của log2n lần. Điều này dẫn đến sự phức tạp cuối cùng của O (n log2n).O(n log2n). Điều đó nói rằng, hãy nhớ các cuộc thảo luận về cách lựa chọn 45 ảnh hưởng đến thời gian chạy của thuật toán. Kịch bản trường hợp tốt nhất O (N) xảy ra khi 45 được chọn gần với trung bình của mảng và kịch bản O (N2) xảy ra khi 45 là giá trị nhỏ nhất hoặc lớn nhất của mảng.Về mặt lý thuyết, nếu thuật toán tập trung đầu tiên vào việc tìm giá trị trung bình và sau đó sử dụng nó làm phần tử 45, thì độ phức tạp trong trường hợp xấu nhất sẽ đi xuống O (n log2N). Trung bình của một mảng có thể được tìm thấy trong thời gian tuyến tính và sử dụng nó làm 45 đảm bảo phần QuickSort của mã sẽ thực hiện trong O (n log2N).Bằng cách sử dụng giá trị trung bình là 45, bạn sẽ kết thúc với thời gian chạy cuối cùng của O (n) + O (n log2N). Bạn có thể đơn giản hóa điều này xuống O (n log2N) vì phần logarit phát triển nhanh hơn nhiều so với phần tuyến tính.Thời gian triển khai Quicksort của bạnĐến bây giờ, bạn đã quen thuộc với quá trình thời gian chạy của thuật toán. Chỉ cần thay đổi tên của thuật toán trong dòng 8:line 8: 7Bạn có thể thực thi tập lệnh như bạn có trước đây: 8Quicksort hoàn thiện không chỉ trong vòng chưa đầy một giây, mà còn nhanh hơn nhiều so với sự hợp nhất ( 19 giây so với 20 giây). Việc tăng số lượng các phần tử được chỉ định bởi 21 từ 22 lên 23 và chạy tập lệnh lại kết thúc với việc kết thúc sắp xếp hợp nhất trong 24 giây, trong khi QuickSort sắp xếp danh sách chỉ trong một 25 giây.Phân tích điểm mạnh và điểm yếu của QuicksortĐúng như tên của nó, Quicksort rất nhanh. Mặc dù trường hợp xấu nhất của nó là về mặt lý thuyết O (N2), nhưng trong thực tế, việc triển khai tốt các nhịp đập nhanh hầu hết các triển khai sắp xếp khác. Ngoài ra, giống như Merge sắp xếp, Quicksort rất đơn giản để song song hóa.parallelize. Một trong những nhược điểm chính của Quicksort, là thiếu đảm bảo rằng nó sẽ đạt được độ phức tạp thời gian chạy trung bình. Mặc dù các trường hợp xấu nhất là rất hiếm, một số ứng dụng nhất định có thể đủ khả năng để có nguy cơ hiệu suất kém, vì vậy chúng chọn các thuật toán ở trong O (n log2N) bất kể đầu vào. Cũng giống như Merge sắp xếp, Quicksort cũng giao dịch không gian bộ nhớ cho tốc độ. Điều này có thể trở thành một hạn chế để sắp xếp các danh sách lớn hơn. Một thử nghiệm nhanh sắp xếp danh sách mười yếu tố dẫn đến kết quả sau: 9Kết quả cho thấy Quicksort cũng trả giá đệ quy khi danh sách đủ nhỏ, mất nhiều thời gian hơn để hoàn thành so với cả hai loại chèn và sắp xếp bong bóng. Thuật toán Timsort trong PythonThuật toán TIMSORT được coi là một thuật toán sắp xếp lai vì nó sử dụng sự kết hợp tốt nhất của cả hai thế giới của loại chèn và sắp xếp hợp nhất. Timsort gần và thân yêu với cộng đồng Python vì nó được tạo ra bởi Tim Peters vào năm 2002 để được sử dụng làm thuật toán sắp xếp tiêu chuẩn của ngôn ngữ Python.Timsort algorithm is considered a hybrid sorting algorithm because it employs a best-of-both-worlds combination of insertion sort and merge sort. Timsort is near and dear to the Python community because it was created by Tim Peters in 2002 to be used as the standard sorting algorithm of the Python language. Đặc điểm chính của Timsort là nó tận dụng các yếu tố đã được phân loại tồn tại trong hầu hết các bộ dữ liệu trong thế giới thực. Chúng được gọi là chạy tự nhiên. Thuật toán sau đó lặp lại trong danh sách, thu thập các yếu tố thành chạy và hợp nhất chúng vào một danh sách được sắp xếp duy nhất.natural runs. The algorithm then iterates over the list, collecting the elements into runs and merging them into a single sorted list. Thực hiện Timsort trong PythonTrong phần này, bạn sẽ tạo ra một triển khai Python Barebones minh họa tất cả các phần của thuật toán Timsort. Nếu bạn quan tâm, bạn cũng có thể kiểm tra triển khai C gốc của Timsort. Bước đầu tiên trong việc thực hiện TimSort là sửa đổi việc triển khai 7 từ trước: 0Việc thực hiện sửa đổi này bổ sung một vài tham số, 27 và 28, chỉ ra phần nào của mảng sẽ được sắp xếp. Điều này cho phép thuật toán TIMSORT sắp xếp một phần của mảng tại chỗ. Sửa đổi chức năng thay vì tạo một cái mới có nghĩa là nó có thể được sử dụng lại cho cả sắp xếp chèn và Timsort.Bây giờ hãy xem việc thực hiện Timsort: 1Mặc dù việc triển khai phức tạp hơn một chút so với các thuật toán trước đó, chúng ta có thể tóm tắt nó một cách nhanh chóng theo cách sau:
Lưu ý làm thế nào, không giống như Merge sắp xếp, Timsort hợp nhất Subarrays đã được sắp xếp trước đó. Làm như vậy làm giảm tổng số so sánh cần thiết để tạo ra một danh sách được sắp xếp. Lợi thế này so với Sắp xếp hợp nhất sẽ trở nên rõ ràng khi chạy thử nghiệm bằng các mảng khác nhau. Cuối cùng, dòng 2 xác định 33. Có hai lý do để sử dụng 32 làm giá trị ở đây:line 2 defines 33. There are two reasons for using 32 as the value
here:
Kết hợp cả hai điều kiện ở trên cung cấp một số tùy chọn cho 35. Việc thực hiện trong hướng dẫn này sử dụng 33 làm một trong những khả năng.Đo lường độ phức tạp của Timsort từ OTrung bình, độ phức tạp của TimSort là O (N log2n), giống như Sắp xếp hợp nhất và Quicksort. Phần logarit xuất phát từ việc nhân đôi kích thước của lần chạy để thực hiện từng thao tác hợp nhất tuyến tính.O(n log2n), just like merge sort and Quicksort. The logarithmic part comes from doubling the size of the run to perform each linear merge operation. Tuy nhiên, Timsort thực hiện đặc biệt tốt trên các danh sách đã được phân loại hoặc gần được sắp xếp, dẫn đến một trường hợp tốt nhất của O (N). Trong trường hợp này, Timsort rõ ràng đánh bại Merge Sắp xếp và phù hợp với kịch bản trường hợp tốt nhất cho Quicksort. Nhưng trường hợp xấu nhất đối với Timsort cũng là O (N log2N), vượt qua Quicksort, O (N2). Thời gian triển khai Timsort của bạnBạn có thể sử dụng 9 để xem Timsort thực hiện cách sắp xếp mảng mười nghìn phần tử: 2Bây giờ thực thi tập lệnh để có thời gian thực hiện là 41: 3Ở 42 giây, việc triển khai TIMSORT này là 43 giây, hoặc 17 %, nhanh hơn so với phân loại hợp nhất, mặc dù nó không khớp với 19 của Quicksort. Nó cũng là một loại nhanh hơn 11.000 phần trăm lố bịch so với sắp xếp chèn!Bây giờ hãy cố gắng sắp xếp một danh sách đã được phân loại bằng bốn thuật toán này và xem điều gì sẽ xảy ra. Bạn có thể sửa đổi phần 45 của mình như sau: 4Nếu bạn thực thi tập lệnh ngay bây giờ, thì tất cả các thuật toán sẽ chạy và xuất ra thời gian thực hiện tương ứng của chúng: 5Lần này, Timsort xuất hiện nhanh hơn ba mươi bảy phần trăm so với phân loại hợp nhất và năm phần trăm nhanh hơn so với Quicksort, uốn cong khả năng tận dụng các lần chạy đã được phân loại. Lưu ý cách Timsort hưởng lợi từ hai thuật toán chậm hơn nhiều khi được sử dụng bởi chính chúng. Thiên tài của Timsort là kết hợp các thuật toán này và chơi theo thế mạnh của họ để đạt được kết quả ấn tượng. Phân tích điểm mạnh và điểm yếu của TimsortNhược điểm chính của Timsort là sự phức tạp của nó. Mặc dù thực hiện một phiên bản rất đơn giản của thuật toán gốc, nhưng nó vẫn đòi hỏi nhiều mã hơn vì nó dựa vào cả 7 và 05.Một trong những ưu điểm của Timsort, là khả năng dự đoán thực hiện trong O (n log2N) của nó bất kể cấu trúc của mảng đầu vào. Tương phản rằng với Quicksort, có thể làm suy giảm xuống O (N2). Timsort cũng rất nhanh đối với các mảng nhỏ vì thuật toán biến thành một loại chèn duy nhất. Đối với việc sử dụng trong thế giới thực, trong đó nó phổ biến để sắp xếp các mảng đã có một số thứ tự có từ trước, Timsort là một lựa chọn tuyệt vời. Khả năng thích ứng của nó làm cho nó trở thành một lựa chọn tuyệt vời để phân loại các mảng có độ dài. Sự kết luậnSắp xếp là một công cụ thiết yếu trong bất kỳ bộ công cụ Pythonista nào. Với kiến thức về các thuật toán sắp xếp khác nhau trong Python và cách tối đa hóa tiềm năng của chúng, bạn đã sẵn sàng để thực hiện các ứng dụng và chương trình hiệu quả hơn, hiệu quả hơn! Trong hướng dẫn này, bạn đã học được:
Bạn cũng đã học về các kỹ thuật khác nhau như đệ quy, phân chia và chinh phục và ngẫu nhiên. Đây là những khối xây dựng cơ bản để giải quyết một danh sách dài các thuật toán khác nhau và chúng sẽ xuất hiện nhiều lần khi bạn tiếp tục nghiên cứu.recursion, divide and conquer, and randomization. These are fundamental building blocks for solving a long list of different algorithms, and they’ll come up again and again as you keep researching. Lấy mã được trình bày trong hướng dẫn này, tạo các thử nghiệm mới và khám phá các thuật toán này hơn nữa. Tốt hơn nữa, hãy thử thực hiện các thuật toán sắp xếp khác trong Python. Danh sách này là rộng lớn, nhưng sắp xếp lựa chọn, Heapsort và Sắp xếp cây là ba tùy chọn tuyệt vời để bắt đầu.selection sort, heapsort, and tree sort are three excellent options to start with. Xem bây giờ hướng dẫn này có một khóa học video liên quan được tạo bởi nhóm Python thực sự. Xem cùng với hướng dẫn bằng văn bản để hiểu sâu hơn về sự hiểu biết của bạn: Giới thiệu về các thuật toán sắp xếp trong Python This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Introduction to Sorting Algorithms in Python Chức năng sắp xếp Python có nhanh không?Thời gian thực hiện Sắp xếp hợp nhất của bạn so với sắp xếp bong bóng và sắp xếp chèn, việc triển khai Sắp xếp hợp nhất là cực kỳ nhanh, sắp xếp mảng mười nghìn phần tử trong chưa đầy một giây!the merge sort implementation is extremely fast, sorting the ten-thousand-element array in less than a second!
Sắp xếp () hoặc sắp xếp () nhanh hơn?Sắp xếp nhanh hơn 13% so với sắp xếp. .
Sự phức tạp của thời gian là sắp xếp trong Python?Sắp xếp.Sắp xếp danh sách Python () đã sử dụng thuật toán TIMSORT kể từ phiên bản 2.3.Thuật toán này có độ phức tạp thời gian chạy của O (N.Logn).O(n. logn).
Phương pháp sắp xếp nào là nhanh nhất?Nếu bạn đã quan sát, độ phức tạp thời gian của QuickSort là O (N logn) trong các trường hợp tốt nhất và trung bình và O (n^2) trong trường hợp xấu nhất.Nhưng vì nó có ưu thế trong các trường hợp trung bình đối với hầu hết các đầu vào, Quicksort thường được coi là thuật toán sắp xếp nhanh nhất trên mạng.Quicksort is O(n logn) in the best and average case scenarios and O(n^2) in the worst case. But since it has the upper hand in the average cases for most inputs, Quicksort is generally considered the “fastest” sorting algorithm. |