美文网首页
2020-06-28【排序】

2020-06-28【排序】

作者: skillplus | 来源:发表于2020-06-28 09:35 被阅读0次
export default class SortUtil {
    /**
     * 冒泡排序: 稳定排序  
     * @param Array
     * @returns  orderly Array 
     */
    bubbleSort(arr: Array<number>) {
        let temp: number;
        let tag = true
        for (let j = 0; tag === true; j++) {
            tag = false;
            for (let i = 0; i < arr.length; i++) {
                if (arr[i] > arr[i + 1]) {
                    temp = arr[i]
                    arr[i] = arr[i + 1];
                    arr[i + 1] = temp;
                    tag = true;
                }
            }
        }
        return arr;
    }

    /**
     *  选择排序: 不稳定排序  
     *  @param Array
     *  @returns orderly Array
     */
    selectionSort(arr: Array<number>) {
        let temp: number;

        for (let i = 0; i < arr.length; i++) {
            for (let j = i + 1; j <= arr.length; j++) {
                if (arr[i] > arr[j]) {
                    temp = arr[i];
                    arr[i] = arr[j]
                    arr[j] = temp;
                }
            }
        }
        return arr;
    }
    /**
     * 插值排序: 稳定排序  可以对数组直接排序, 也可以将一组无序数组插入另一组有序数组中  
     * @param arr  
     * @param sortedArray  待排序数组,填就排序并插入arr数组,可选参数
     * @returns  orderly Array 
     */
    insertionSort(arr: number[], sortedArray?: number[]) {
        if (sortedArray) {
            for (let i = 0; i < sortedArray.length; i++) {

                for (let j = arr.length - 1; j >= 0; j--) {
                    if (sortedArray[i] >= arr[j]) {
                        arr.splice(j + 1, 0, sortedArray[i]);
                        break;
                    } else if (sortedArray[i] < arr[0]) {
                        arr.unshift(sortedArray[i])
                        break
                    }
                }
            }
            return arr;
        }

        let temp;
        for (let i = 0; i < arr.length - 1; i++) {

            for (let j = i + 1; j > 0; j--) {
                if (arr[j] < arr[j - 1]) {
                    temp = arr[j - 1];
                    arr[j - 1] = arr[j];
                    arr[j] = temp;
                } else {
                    break
                }
            }
        }
        return arr;
    }

    /**
     * 快速排序: 不稳定 效率较高  
     * @param arr, 
     * @begin 第一个元素下标
     * @end  最后一个元素下标
     * @returns  orderly Array 
     */
    quickSort(arr: number[], begin: number, end: number) {
        if (end <= begin) {
            return arr;
        }
        let i = begin;
        let j = end;
        let key = arr[begin]
        while (true) {
            while (true) {
                if (i == j)
                    break;
                if (arr[j] < key) {
                    let temp = arr[j];
                    arr[j] = arr[i];
                    arr[i] = temp;
                    break;
                }
                j--;
            }
            while (true) {
                if (i == j) {
                    break;
                }
                if (arr[i] > key) {
                    let temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                    break;
                }
                i++;
            }
            if (i == j)
                break;
        }
        if (end - j > 1) {
            arr = this.quickSort(arr, j + 1, end);
        }
        if (i - begin > 1) {
            arr = this.quickSort(arr, begin, i)
        }

        return arr;
    }

    /**
     * 希尔排序: 插入排序的升级版,不稳定,适合中等数组排序
     * @param arr
     * @returns orderly Array
     */
    shellSort(arr: number[]) {
        let len = arr.length;
        for (let fraction = Math.floor(len / 2); fraction > 0; fraction = Math.floor(fraction / 2)) {
            for (let i = fraction; i < len; i++) {
                for (let j = i - fraction; j >= 0 && arr[j] > arr[fraction + j]; j -= fraction) {
                    let temp = arr[j];
                    arr[j] = arr[fraction + j];
                    arr[fraction + j] = temp;
                }
            }
        }
        return arr;
    }

    /**
     * 基数排序:不稳定 适用于数组中最大值和最小值差值较小的数组排序
     * @param arr 
     * @param maxDigit  数组中最大元素的位数(最大元素为111就是3,1111就是4)
     * @returns new orderly Array
     */
    radixSort(arr: number[], maxDigit: number) {
        let counter = [];
        let mod = 10;
        let dev = 1;
        for (let i = 0; i < maxDigit; i++ , dev *= 10, mod *= 10) {
            for (let j = 0; j < arr.length; j++) {
                let bucket = parseInt(((arr[j] % mod) / dev).toString());
                if (counter[bucket] == null) {
                    counter[bucket] = [];
                }
                counter[bucket].push(arr[j]);
            }
            let pos = 0;
            for (let j = 0; j < counter.length; j++) {
                let value = null;
                if (counter[j] != null) {
                    while ((value = counter[j].shift()) != null) {
                        arr[pos++] = value;
                    }
                }
            }
        }
        return arr;
    }

    /**
     * 归并排序: 稳定排序,效率较高
     * @param arr
     */
    mergeSort(arr: number[]) {
        let len = arr.length;
        if (len < 2) {
            return arr;
        }
        let middle = Math.floor(len / 2),
            left = arr.slice(0, middle),
            right = arr.slice(middle);
        return this.merge(this.mergeSort(left), this.mergeSort(right));
    }

    merge(left: number[], right: number[]) {
        let result = [];
        while (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());
        return result;
    }

}

相关文章

网友评论

      本文标题:2020-06-28【排序】

      本文链接:https://www.haomeiwen.com/subject/uwrifktx.html