Computer >> Máy Tính >  >> Lập trình >> Python

Cách viết mã một QuickSort trong Python

Một Python QuickSort chọn một phần tử xoay và chia các phần tử của an mảng thành hai mới mảng s. Các số cao hơn trục xoay chuyển thành một mảng đ ặc điểm; các số thấp hơn trục chuyển sang một số khác. Mỗi mảng được sắp xếp và sau đó là tất cả mảng s được hợp nhất thành một.

Cách viết mã một phân loại nhanh Python

Có rất nhiều thuật toán sắp xếp mà bạn có thể sử dụng để sắp xếp một danh sách trong lập trình. Có các loại chèn Python, sắp xếp bong bóng và hơn thế nữa. QuickSort là một trong những kiểu sắp xếp phổ biến nhất.

Trong hướng dẫn này, chúng ta sẽ nói về QuickSorts là gì và cách chúng hoạt động. Chúng tôi sẽ giới thiệu cho các bạn một ví dụ về Python QuickSort để bạn có thể tìm hiểu cách triển khai một ví dụ này.

Không cần thêm lời khuyên nào nữa, hãy bắt đầu!

Python QuickSort là gì?

Thuật toán Python QuickSort chia một mảng thành các mảng con. Thuật toán này gọi các mảng con này một cách đệ quy để sắp xếp từng phần tử trong danh sách. Nội dung của mảng con được xác định bởi một phần tử tổng hợp không được chuyển vào mảng con mới.

Thuật toán QuickSort phân chia-và-chinh phục. Điều này có nghĩa là nhiệm vụ sắp xếp danh sách được chia thành nhiều nhiệm vụ con. Vào cuối quá trình sắp xếp, kết quả của các nhiệm vụ con này kết hợp với nhau để trả về một danh sách đã sắp xếp.

Trong QuickSort, nhiệm vụ con đang đặt một trục cho từng danh sách con và sắp xếp các phần tử dựa trên giá trị của chúng so với trục.

Khi nào tôi nên sử dụng Python QuickSort?

Một QuickSort hữu ích khi vấn đề phức tạp về thời gian. Điều này là do QuickSort sử dụng ít dung lượng bộ nhớ hơn các thuật toán khác, điều này giúp tăng hiệu quả cho chúng.

81% người tham gia cho biết họ cảm thấy tự tin hơn về triển vọng công việc công nghệ của mình sau khi tham gia một cuộc thi đào tạo. Kết hợp với bootcamp ngay hôm nay.

Sinh viên tốt nghiệp bootcamp trung bình dành ít hơn sáu tháng để chuyển đổi nghề nghiệp, từ khi bắt đầu bootcamp đến khi tìm được công việc đầu tiên của họ.

Bạn chỉ nên sử dụng QuickSort nếu bạn đã quen thuộc với đệ quy Python. Điều này là do thuật toán QuickSort phụ thuộc vào các hàm đệ quy.

Một QuickSort hiệu quả hơn một sắp xếp hợp nhất trên các mảng nhỏ hơn. Tuy nhiên, trên các tập dữ liệu lớn hơn, sắp xếp chèn hoặc sắp xếp hợp nhất có thể nhanh hơn.

QuickSort hoạt động như thế nào?

Một QuickSort chọn một phần tử để làm trục xoay. Đây có thể là bất kỳ phần tử nào trong danh sách. Đối với hướng dẫn này, chúng tôi sẽ chọn mục cuối cùng trong danh sách (3).

8 4 5 2 1 3

Một QuickSort so sánh giá trị của pivot với mọi số khi chúng ta lặp qua các mục trong danh sách. Nếu một mục lớn hơn số trục, chúng tôi di chuyển số sau trục; nếu không, chúng tôi di chuyển số trước trục:

2 1 3 8 5 4

Giá trị 3 đã di chuyển xuống danh sách của chúng tôi. Tất cả các mục nhỏ hơn 3 di chuyển sang trái của nó; tất cả các giá trị lớn hơn ba được chuyển sang bên phải của nó.

Mảng Python của chúng tôi được chia thành hai nửa:các mục lớn hơn trục và các mục nhỏ hơn một trục.

Khi quá trình này đã bắt đầu, một trục xoay mới sẽ bắt đầu trên mỗi nửa của hai nửa. Trục này bắt đầu riêng biệt và sử dụng cùng một thuật toán như trên. Đầu tiên, chúng tôi sẽ đặt giá trị tổng hợp bằng giá trị cuối cùng trong mỗi danh sách:

Pivot One

Pivot Two

2 1
8 5 4

Tiếp theo, chúng tôi sẽ di chuyển tất cả các giá trị lớn hơn một trục sang bên phải của trục. Chúng tôi di chuyển tất cả các giá trị nhỏ hơn trục xoay sang trái.

Pivot One

Pivot Two

1 2
4 8 5

Quá trình này tiếp tục cho đến khi chúng tôi sắp xếp danh sách của mình:

Lần đầu tiên 1 2
4 8 5
Lần thứ hai
1

8 5





5 87t? /
Lần thứ ba




8

Mảng cuối cùng của chúng ta trông như thế này:

1 2 3 4 5 8

Ví dụ về phân loại nhanh trong Python

QuickSort cần hai chức năng:một chức năng xoay và một chức năng QuickSort.

Hãy bắt đầu với chức năng phân vùng. Thao tác này sẽ phân vùng hoặc chuẩn bị mảng dựa trên giá trị của phần tử pivot.

Chức năng phân vùng của chúng tôi sẽ:

  1. Chọn phần tử tổng hợp
  2. Di chuyển tất cả các mục lớn hơn trục quay sang bên phải trục quay
  3. Di chuyển tất cả các mục ít hơn trục xoay sang bên trái của trục quay

Chương trình Python QuickSort

Hãy viết một chương trình thực hiện thuật toán này:

 def chuẩn bị (số, thấp, cao):pivot =số [cao] item =thấp - 1 cho tôi trong phạm vi (thấp, cao):nếu số [i] <=pivot:item =item + 1 (số [mặt hàng], số [i]) =(số [i], số [mặt hàng]) (số [mặt hàng + 1], số [cao]) =(số [cao], số [mặt hàng + 1]) trả lại mặt hàng + 1 

Đầu tiên, chúng tôi chọn một phần tử xoay. Con số này bằng với con số cao nhất trong danh sách của chúng tôi.

Tiếp theo, chúng tôi lặp qua tất cả các mục trong danh sách bằng cách sử dụng vòng lặp Python for. Nếu một số nhỏ hơn hoặc bằng trục xoay, nó sẽ được di chuyển sang bên trái của trục. Nếu không, nó sẽ chuyển sang bên phải của trục.

Hàm Python của chúng tôi trả về giá trị cao mới. Giá trị cao mới bằng với mục + 1.

Tiếp theo, chúng tôi phải chạy thuật toán của mình. Chúng ta có thể làm điều này bằng cách viết một hàm riêng biệt:

 def quick_sort (số, thấp, cao):nếu thấp  

Hàm này kiểm tra xem giá trị của "thấp" có nhỏ hơn giá trị của "cao" hay không. Nếu đúng như vậy, việc sắp xếp của chúng ta có thể tiếp tục. Nếu không, việc sắp xếp của chúng ta sẽ dừng lại. Nếu quá trình sắp xếp của chúng tôi dừng lại, điều đó có nghĩa là chúng tôi đã sắp xếp danh sách.

Tiếp theo, hàm của chúng ta gọi hàm chuẩn bị () phương pháp. Điều này xác định một con trỏ cho trục và di chuyển các mục đến đúng vị trí của chúng.

Sau đó, hàm của chúng tôi gọi hàm quick_sort () phương pháp hai lần. Lần đầu tiên, chúng tôi chạy QuickSort trên các phần tử ở bên trái của trục. Lần thứ hai, chúng tôi chạy QuickSort trên các phần tử ở bên phải của trục. Do đó, hàm của chúng ta là đệ quy vì nó gọi chính nó.

Điều này tiếp tục cho đến khi mọi mục trong danh sách được sắp xếp.

Viết một phương pháp chính

Hãy viết một chương trình chính xác định một danh sách để sắp xếp:

 giá trị =[8, 4, 5, 2, 1, 3] total_values ​​=len (giá trị) quick_sort (giá trị, 0, total_values ​​- 1) print (giá trị) 

Đầu tiên, chúng tôi chỉ định một danh sách các giá trị để sắp xếp. Chúng tôi sử dụng phương thức Python len () để tính độ dài của danh sách các giá trị của chúng tôi. Tiếp theo, chúng tôi gọi quick_sort () phương pháp.

Chúng tôi chuyển "giá trị" dưới dạng các số mà chúng tôi muốn sắp xếp. Sau đó, chúng tôi chuyển 0 là số thấp. Độ dài của "giá trị" trừ đi 1 là giá trị cao mà chúng tôi chỉ định. Giá trị cao là độ dài của các giá trị trừ đi 1 vì mục đầu tiên trong danh sách có số chỉ mục là 0.

Hãy thử chạy chương trình của chúng tôi:

 [1, 2, 3, 4, 5, 8] 

Mã của chúng tôi trả về một danh sách được sắp xếp! Chúng ta làm được rồi. Hãy tạo cho mình một cái vỗ nhẹ vào lưng. QuickSort không dễ hiểu hoặc dễ thực hiện.

Tổng quan về độ phức tạp

Trung bình, thuật toán này sẽ thực hiện ở O (n * log n). Điều này xảy ra khi phần tử xoay không phải là phần tử lớn nhất hoặc nhỏ nhất và khi phần tử xoay không gần phần tử giữa.

QuickSort có độ phức tạp trong trường hợp xấu nhất là O (n2). Điều này xảy ra khi phần tử được chọn làm trục quay là phần tử lớn nhất hoặc nhỏ nhất. Nếu trường hợp này xảy ra, phần tử pivot sẽ luôn ở cuối một mảng được sắp xếp. Điều này sẽ tạo ra một số mảng con không cần thiết.

Độ phức tạp trường hợp tốt nhất cho thuật toán này là O (n * log n). Điều này xảy ra khi phần tử pivot bằng phần tử giữa hoặc gần phần tử giữa.

Để tìm hiểu thêm về độ phức tạp của thuật toán, hãy xem hướng dẫn của chúng tôi về Ký hiệu Big O.

Kết luận

Python QuickSorts sử dụng đệ quy để chia nhỏ danh sách thành các danh sách nhỏ hơn, sau đó được sắp xếp. Mỗi danh sách được sắp xếp xung quanh một phần tử trụ. Các phần tử lớn hơn trục được di chuyển sang bên phải của nó; các phần tử nhỏ hơn được di chuyển sang bên trái của trục.

Để được hướng dẫn về các tài nguyên học Python hàng đầu, các khóa học trực tuyến và sách, hãy đọc hướng dẫn Cách học Python toàn diện của chúng tôi.