Đắm mình vào sự kì diệu của các thuật toán sắp xếp, tôi mới biết con người thật đáng nể khi sáng tạo ra rất nhiều các loại thuật toán sắp xếp hay ho, thú vị, hiệu quả và đầy hack não. Các thuật toán như Selection Sort, Quick Sort, Bubble Sort, Insertion Sort, Merge Sort,etc đã quá quen thuộc với dân lập trình chúng ta.
Nhiều khi chúng ta tự hỏi thuật toán sắp xếp nào nhanh nhất trong vô vàn các loại thuật toán.
Thì câu trả lời là Tùy Trường Hợp mà ta sử dụng cho hiệu quả. Nhưng về cơ quả thì các thuật toán sắp xếp Comparison-Based thì QuickSort vẫn là một lựa chọn tốt vì Time Complexity trung bình = O(n log(n)) và Space Complexity tệ nhất cũng chỉ là O(log(n)). Tuy Merge Sort có thế sắp xếp nhanh hơn trong trường hợp tệ nhất nhưng nó lại quá tốn Storage Space.
Tham khảo thêm qua video:
Mối thuật toán sắp xếp sẽ có ưu nhược điểm khác nhau và mỗi trường hợp cụ thể ta sẽ dùng một thuật toán sắp xếp cụ thể để có thể mang đến kết quả tốt nhất có thể.
Và làm sao ta biết trường hợp nào là nên dùng thuật toán sắp xếp nào trường hợp nào không nên dùng thuật toán nào ? Dù ta biết cách thức hoạt động, triển khai từng thuật toán và ý tưởng của nó. Thì việc triển khai và so sánh trong từng trường hợp vẫn là một việc làm mất khá nhiều công sức và thời gian.
Và tôi sẽ đến lợi ích của Arrays.sort() một phương thức có sẵn trong Java. Một công cụ tuyệt với. Theo Java doc của oracle:
public static void sort(int[] a)
Sorts the specified array into ascending numerical order.
Implementation note: The sorting algorithm is a Dual-Pivot Quicksort by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm offers O(n log(n)) performance on many data sets that cause other quicksorts to degrade to quadratic performance, and is typically faster than traditional (one-pivot) Quicksort implementations.
Parameters:a
– the array to be sorted
Một công cụ sắp xếp tuyệt vời được viết sắn để sắp xếp dựa trên thuật toán QuickSort với TimeComplexity O(n log(n)) trong rất nhiều trường hợp với Dual-Pivot chứ không phải one-Pivot Quick Sort truyền thống nên nó sẽ giảm thiếu độ phức tạp xuống nhiều lần. Vì thế đây không chỉ là QickSort bình thường mà nó thực sự là “Quick”.
Và theo Java Doc JDK 8 nó không chỉ chọn một thuật toán mà lên đến 4 thuật toán tùy vào ngưỡng đầu vào.
/**
* If the length of an array to be sorted is less than this
* constant, Quicksort is used in preference to merge sort.
*/
private static final int QUICKSORT_THRESHOLD = 286;
/**
* If the length of an array to be sorted is less than this
* constant, insertion sort is used in preference to Quicksort.
*/
private static final int INSERTION_SORT_THRESHOLD = 47;
/**
* If the length of a byte array to be sorted is greater than this
* constant, counting sort is used in preference to insertion sort.
*/
private static final int COUNTING_SORT_THRESHOLD_FOR_BYTE = 29;
/**
* If the length of a short or char array to be sorted is greater
* than this constant, counting sort is used in preference to Quicksort.
*/
private static final int COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR = 3200;
Tất nhiên Arrays.sort() không phải là sort nhanh nhất nhưng nó rất tiện lợi, hữu ích sắp xếp Quick trong rất nhiều trường hợp mà ta không cần phải đắn đo suy nghĩ nên dùng loại thuật toán sắp xếp nào.
Ngoài Arrays.sort() Java còn có một công cụ tuyệt với khác là Arrays. parallelSort() bằng cách xử lí đa luồng kết hợp kiểu sắp xếp như Merge Sort nó sẽ sắp xếp với tốc độ nhanh hơn đáng để so với Arrays.sort() nếu input đầu vào với số lượng phần tử rất lớn.
Tham khảo thêm qua:
https://stackoverrun.com/vi/q/4717483
https://stackoverflow.com/questions/4305004/why-arrays-sort-is-quicksort-algorithm-why-not-another-sort-algorithm
https://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html#parallelSort-int:A-
Chốt lại : Nếu phải chọn tôi sẽ chọn Arrays.sort() hoặc Arrays.parallelSort() đầu tiên vì nó viết quá đơn giản 😀 . Và nó cũng tốt và nhanh trong rất nhiều trường hợp nữa.
Conal Dev