常见排序算法(JS)

测试数组

 let arr = [49, 38, 65, 97, 76, 13, 27, 49];

1.冒泡排序
每一轮排序,都比较元素相邻的值,若大小顺序不对,则交换元素的位置。保证每一轮将当前剩余元素的最大值放到最后。

        function BubbleSort(arr) {
    
    
            var len = arr.length;
            var temp;
            for (var i = len - 1; i >= 0; i--) {
    
    
                for (var j = 0; j < i; j++) {
    
    
                    if (arr[j] > arr[j + 1]) {
    
    
                        temp = arr[j];
                        arr[j] = arr[j + 1];
                        arr[j + 1] = temp;
                    }
                }
                console.log(arr);
            }
        }
        BubbleSort(arr);

输出

Array(8) [ 49, 38, 65, 97, 76, 13, 27, 49 ]

Array(8) [ 38, 49, 65, 76, 13, 27, 49, 97 ]
Array(8) [ 38, 49, 65, 13, 27, 49, 76, 97 ]
Array(8) [ 38, 49, 13, 27, 49, 65, 76, 97 ]
Array(8) [ 38, 13, 27, 49, 49, 65, 76, 97 ]
Array(8) [ 13, 27, 38, 49, 49, 65, 76, 97 ]
Array(8) [ 13, 27, 38, 49, 49, 65, 76, 97 ]
Array(8) [ 13, 27, 38, 49, 49, 65, 76, 97 ]
Array(8) [ 13, 27, 38, 49, 49, 65, 76, 97 ]

2.选择排序
每一轮排序,找到当前剩余元素的最小值(最大值),并记录它的下标。每一轮查找之后,将当前最小值(最大值)与当前剩余元素的首元素或尾元素交换位置。

        function SelectSort(arr){
    
    
            var len = arr.length;
            var min,temp;
            for(var i=0;i<len;i++){
    
    
                min=i;
                for(var j=i+1;j<len;j++){
    
    
                    if(arr[j]<arr[min]) min = j;
                }
                if(min!=i){
    
    
                    temp = arr[min];
                    arr[min] = arr[i];
                    arr[i] = temp;
                }
                console.log(arr);
            }
        }
        SelectSort(arr);

输出

Array(8) [ 49, 38, 65, 97, 76, 13, 27, 49 ]

Array(8) [ 13, 38, 65, 97, 76, 49, 27, 49 ]
Array(8) [ 13, 27, 65, 97, 76, 49, 38, 49 ]
Array(8) [ 13, 27, 38, 97, 76, 49, 65, 49 ]
Array(8) [ 13, 27, 38, 49, 76, 97, 65, 49 ]
Array(8) [ 13, 27, 38, 49, 49, 97, 65, 76 ]
Array(8) [ 13, 27, 38, 49, 49, 65, 97, 76 ]
Array(8) [ 13, 27, 38, 49, 49, 65, 76, 97 ]
Array(8) [ 13, 27, 38, 49, 49, 65, 76, 97 ]

3.插入排序
从第一项开始,记录此时的值。然后依次比较它前面的元素,若比它大,则前面的元素向后移动一位,直到找到比它小的元素,并将自己插入到这个元素的后面一位。

        function InsertSort(arr) {
    
    
            var len = arr.length;
            var temp;
            for (var i = 1; i < len; i++) {
    
    
                temp = arr[i];
                var j = i - 1;
                while (j >= 0 && arr[j] > temp) {
    
    
                    arr[j + 1] = arr[j];
                    j--;
                }
                arr[j + 1] = temp;
                console.log(arr);
            }
        }
        InsertSort(arr);

输出

Array(8) [ 49, 38, 65, 97, 76, 13, 27, 49 ]

Array(8) [ 38, 49, 65, 97, 76, 13, 27, 49 ]
Array(8) [ 38, 49, 65, 97, 76, 13, 27, 49 ]
Array(8) [ 38, 49, 65, 97, 76, 13, 27, 49 ]
Array(8) [ 38, 49, 65, 76, 97, 13, 27, 49 ]
Array(8) [ 13, 38, 49, 65, 76, 97, 27, 49 ]
Array(8) [ 13, 27, 38, 49, 65, 76, 97, 49 ]
Array(8) [ 13, 27, 38, 49, 49, 65, 76, 97 ]

4.希尔排序
将数组按照一定间隔分组,分组里面使用插入排序,每次排序之后减小分组的大小,再次在每个分组里面排序,直到最后分组为1。

        function ShellSort(arr) {
    
    
            var len = arr.length;
            var gap = len >> 1;
            while (gap >= 1) {
    
    
                for (var i = 0; i < gap; i++) {
    
    
                    for (var j = gap + i; j < len; j += gap) {
    
    
                        var k = j - gap;
                        var temp = arr[j];
                        while (k >= 0 && arr[k] > arr[j]) {
    
    
                            arr[k + gap] = arr[k];
                            k -= gap;
                        }
                        if (j != k + gap) {
    
    
                            arr[k + gap] = temp;
                        }
                    }
                }
                gap = gap >> 1;
                console.log(arr);
            }
        }
        ShellSort(arr);
Array(8) [ 49, 38, 65, 97, 76, 13, 27, 49 ]

Array(8) [ 49, 13, 27, 49, 76, 38, 65, 97 ]
Array(8) [ 27, 13, 49, 38, 65, 49, 76, 97 ]
Array(8) [ 13, 27, 38, 49, 49, 65, 76, 97 ]

5.快速排序
快速排序图解

        function QuickSort(arr) {
    
    
            var len = arr.length;
            function sort(arr, left, right) {
    
    
                var start = left,
                    end = right;
                var base = arr[start];
                while (start < end) {
    
    
                    while (end > start && arr[end] >= base) {
    
    
                        end--;
                    }
                    if (end == start) break;
                    arr[start] = arr[end];
                    while (end > start && arr[start] <= base) {
    
    
                        start++;
                    }
                    if (end == start) break;
                    arr[end] = arr[start];
                }
                arr[start] = base;
                console.log(arr);
                if(start-1>left) sort(arr,left,start-1);
                if(end+1<right) sort(arr,end+1,right);
            }
            sort(arr, 0, len - 1);
        }
        QuickSort(arr);

输出

Array(8) [ 49, 38, 65, 97, 76, 13, 27, 49 ]

Array(8) [ 27, 38, 13, 49, 76, 97, 65, 49 ]
Array(8) [ 13, 27, 38, 49, 76, 97, 65, 49 ]
Array(8) [ 13, 27, 38, 49, 49, 65, 76, 97 ]
Array(8) [ 13, 27, 38, 49, 49, 65, 76, 97 ]

6.归并排序
将数组不断拆分为两个数组,直到最后数组中只有两个元素,再把数据按顺序两两归并到一起。

        function MergeSort(arr) {
    
    
            function merge(arr) {
    
    
                var len = arr.length;
                if (len < 2) return arr;
                else{
    
    
                    var mid = len >> 1;
                    var left = arr.slice(0, mid);
                    var right = arr.slice(mid);
                    return sort(merge(left), merge(right));
                }
            }
            function sort(left, right) {
    
    
                var result = [];
                if (left.length && right.length) {
    
    
                    if (left[0] < right[0]) {
    
    
                        result.push(left.shift());
                    } else {
    
    
                        result.push(right.shift());
                    }
                }
                while (left.length) {
    
    
                    result.push(left.shift());
                }
                while (right.length) {
    
    
                    result.push(right.shift());
                }
                console.log(result);
                return result;
            }
            merge(arr);
        }
        MergeSort(arr);

输出

Array(8) [ 49, 38, 65, 97, 76, 13, 27, 49 ]

Array [ 38, 49 ]
Array [ 65, 97 ]
Array(4) [ 38, 49, 65, 97 ]
Array [ 13, 76 ]
Array [ 27, 49 ]
Array(4) [ 13, 76, 27, 49 ]
Array(8) [ 13, 38, 49, 65, 97, 76, 27, 49 ]

7.堆排序
堆排序图解

        function HeapSort(arr) {
    
    
            var len = arr.length;
            for (var i = len; i > 0; i--) {
    
    
                heap(arr, i);
                var temp = arr[0];
                arr[0] = arr[i - 1];
                arr[i - 1] = temp;
                console.log(arr);
            }

            function heap(arr, len) {
    
    
                for (var i = len >> 1; i >= 0; i--) {
    
    
                    sort(arr, i);
                }

                function sort(arr, x) {
    
    
                    var left = x * 2 + 1;
                    var right = x * 2 + 2;
                    var max = x;
                    if (left < len && arr[left] > arr[max]) {
    
    
                        max = left;
                    }
                    if (right < len && arr[right] > arr[max]) {
    
    
                        max = right;
                    }
                    var temp = arr[max];
                    arr[max] = arr[x];
                    arr[x] = temp;
                    if (max != x)
                        sort(arr, max);
                }
            }
        }
        HeapSort(arr);

输出

Array(8) [ 49, 38, 65, 97, 76, 13, 27, 49 ]

Array(8) [ 38, 76, 65, 49, 49, 13, 27, 97 ]
Array(8) [ 27, 49, 65, 38, 49, 13, 76, 97 ]
Array(8) [ 13, 49, 27, 38, 49, 65, 76, 97 ]
Array(8) [ 13, 49, 27, 38, 49, 65, 76, 97 ]
Array(8) [ 13, 38, 27, 49, 49, 65, 76, 97 ]
Array(8) [ 27, 13, 38, 49, 49, 65, 76, 97 ]
Array(8) [ 13, 27, 38, 49, 49, 65, 76, 97 ]
Array(8) [ 13, 27, 38, 49, 49, 65, 76, 97 ]

猜你喜欢

转载自blog.csdn.net/weixin_42834729/article/details/107099703
今日推荐