Hướng dẫn và mô phỏng thuật toán sắp xếp Quick Sort

  • Code Vui
  • 04/10/2020
  • Lượt xem: 4,493

Giải thuật là lấy ngẫu nhiên một phần tử (phần tử chốt) để chia nhỏ thành 2 mảng, gọi là mảng trái và phải. Sau đó so sánh từng phần tử của mảng trái, phải so với phần tử chốt. Trong trường hợp sắp xếp tăng dần thì so sánh tìm phần tử mảng trái lớn hơn phần tử chốt và tim phần tử mảng phải nhỏ hơn phần tử chốt và thực hiện hoán đổi cho nhau. Tại mốc phần tử được hoán đổi sẽ tiếp tục phân chia nhỏ mảng để tiếp tục sắp xếp.

Tiếp tục phân chia các mảng nhỏ và thực hiện cho tới khi các mảng con có độ dài bằng 1. 

Sau đây là mô phỏng thuật toán Quick Sort
Tạo dãy số ngẫu nhiên để mô phỏng sắp xếp
Tạo dãy số
Mã nguồn được thực hiện trên Javascript
var QuickSort = function ()
{
    $.extend(this, new SortX());

    this.onCreateScripts = function (array, scripts)
    {
        var $this = this;

        var addScript = function (a1, a2, action, left, right)
        {
            if (left) scripts.push({ run: function () { $this.getRow1().find(".fa-caret-down").remove(); a1.a.parent().append("<i class='fa fa-caret-down'></i>"); } });
            if (right) scripts.push({ run: function () { $this.getRow1().find(".fa-caret-up").remove(); a2.a.parent().append("<i class='fa fa-caret-up'></i>"); } });
            scripts.push($this.createScript0(a1, a2)); // Script lấy ra 2 số cần so sánh
            scripts.push($this.createScript1(a1, a2)); // Script để thực hiện so sánh giữa 2 số
            return action();
        }
        var addScriptLeftRight = function (left, right)
        {
            var script = {};
            script.run = function ()
            {                    
                $this.getRow1().find(".fa").remove();
                left.a.parent().append("<i class='fa fa-chevron-left'></i>");
                right.a.parent().append("<i class='fa fa-chevron-right'></i>");
            }
            scripts.push(script);
        }            

        var sort = function (left, right)
        {
            if (array.length == 0) return;
            if (left >= right) return;

            var middle = parseInt(left + (right - left) / 2);
            var pivot = array[middle];

            addScriptLeftRight(array[left], array[right]);
            scripts.push($this.createScriptPivot(pivot));                

            var i = left, j = right;

            while (i <= j)
            {
                while (addScript(array[i], pivot, () => array[i].number < pivot.number, true, false)) i++;
                while (addScript(pivot, array[j], () => array[j].number > pivot.number, false, true)) j--;                    

                if (i <= j)
                {
                    var a1 = array[i];
                    var a2 = array[j];

                    array[j] = a1;
                    array[i] = a2;

                    scripts.push($this.createScript2(a1, a2)); // Script thực hiện hoán đổi giữa 2 số với nhau.

                    i++;
                    j--;
                }
            }

            if (left < j) sort(left, j);
            if (right > i) sort(i, right);
        }

        // Bắt đầu thực hiện sắp xếp
        sort(0, array.length - 1);

        // Clear 2 vị trí đầu cuối ở mảng sắp xếp cuối cùng
        scripts.push({ run: function () { $this.getRow1().find(".fa").remove(); } });
    }
}

var pageSortX = new PageSortX();
pageSortX.sortX = new QuickSort();
pageSortX.start();

Phần tử chốt ảnh hưởng khá nhiều tới việc sắp xếp, trong đoạn code mô phỏng thì tôi lấy phần tử chốt là ở chính giữa. Tuy nhiên có thể chọn phần tử chốt là phần tử đầu, cuối của mảng.

Mô hình để thực hiện bài toán mô phỏng được là Strategy Pattern mà tôi đã chia sẻ ở bài viết Mô phỏng phép tính nhân 2 số bé hơn và gần bằng 100

Chúc các bạn một ngày cuối tuần vui vẻ

Sơn 20

Nếu bạn thấy nội dung chia sẻ này có ích với bạn hãy Donate để tạo động lực cho tôi viết các bài viết tiếp theo nhé. Cảm ơn nhiều !!!!

Bài viết liên quan

Hướng dẫn và mô phỏng thuật toán sắp xếp Insertion Sort

Thuật toán dựa trên ý tưởng xếp bài khi lần lượt di chuyển phần tử về bên trái

06/10/2020 Xem chi tiết
Hướng dẫn và mô phỏng thuật toán sắp xếp Bubble sort

Đây là thuật toán sắp xếp cơ bản nhất dành cho người mới học lập trình

03/09/2020 Xem chi tiết

Bài viết cùng chuyên mục

Code javascript mô phỏng 50 xe của một xí nghiệp taxi chạy online trên bản đồ

Mô phỏng hiển thị xe chạy theo thời gian thực, sử dụng thư viện bản đồ leafletjs.

15/11/2020 Xem chi tiết
Code mô phỏng lộ trình của xe taxi chạy trên bản đồ

Dùng thư viện leafletjs để thay cho google map api mô phỏng lộ trình xe chạy.

04/11/2020 Xem chi tiết
Mô phỏng cách tính nhanh từ năm dương lịch sang năm âm lịch

Tính nhanh năm âm lịch từ năm 1900 tới nay gồm 2 bước nhẩm tính Can, Chi. Tôi 1983 nhẩm nhanh là Quý Hợi

25/10/2020 Xem chi tiết
Hướng dẫn và mô phỏng thuật toán sắp xếp Selection Sort

Sắp xếp chọn là một thuật toán sắp xếp đơn giản, dựa trên việc so sánh tại chỗ.

17/10/2020 Xem chi tiết
Mô phỏng tính nhẩm nhanh một số nhân với 99

Cách tính nhanh nhân một số có 2 chữ số với 99

03/10/2020 Xem chi tiết
Mô phỏng phép tính nhân 2 số bé hơn và gần bằng 100

Phương pháp tính nhẩm siêu nhanh với 2 số bé hơn và gần bằng 100.

18/09/2020 Xem chi tiết
{"nalias":"huong-dan-va-mo-phong-thuat-toan-sap-xep-quick-sort","lang":"2","cattype":"0","catId":"9","UrlEngine":"UrlNewsEngine","site":"1"}