排序算法-快速排序

1、快排原理:

  原理是通过一趟排序,奖数据分成左右两部分,其中一部分比另外一部分的所有数字都要大。

  再通过此法将左右两部分再次排序,知道所有的左右两个不可分割为止。

  算法步骤:

    1)设置两个变量i,j,排序开始的时候:i = 0,j=N-1;

    2)以第一个数组元素作为关键数据,复制key,即key = A【0】

    3)从j开始向前寻找,即由后向前搜寻(j--),找到第一个小于key的值A【j】,奖A【i】与A【j】互换;

    4)从i开始向后手续(i++),找到第一个大于key的A[i],奖A【i】与A[j]互换;

    5)重复3和4的步骤,直到 i=j;

     3和4步中,没找到符合条件的值,即3中A[j]不小于key,4中A【i】不大于key的时候改变j,i值,使得j=j +1,i = i+1,直到找到为止。

     符合条件的值,进行交换的时候i,j指针为止不变。另外,i==j这一过程正好是i+或j-完成的时候,此时循环结束。

  

 

2、实现:

  1)应用上面原理理论的实现方法

  ts代码实现:
export default class SortManager {
    /**
     * 数组快排1
     * @param arr 要排序的数组
     * @param left  数组排序的开始位置
     * @param right 数组排序的结束位置
    */
    static quickSort(arr: number[], left: number, right: number): number[] {
        if (left >= right) return arr;
        let i = left, j = right, base = arr[left];

        while (i != j) {
            //顺序很重要,要从右开始找
            while (arr[j] >= base && i < j)
                j--;

            //再找左边的
            while (arr[i] <= base && i < j)
                i++;

            //交换两个数在数组中的位置
            if (i < j) {
                let t = arr[i];
                arr[i] = arr[j];
                arr[j] = t;
            }

        }
        //最终基准归位
        arr[left] = arr[i];
        arr[i] = base;
        SortManager.quickSort1(arr, left, i - 1);
        SortManager.quickSort1(arr, i + 1, right);
        return arr;
    }
}
  js代码实现:
 function quickSort(arr: number[], left: number, right: number): number[] {
        if (left >= right) return arr;
        let i = left, j = right, base = arr[left];

        while (i != j) {
            //顺序很重要,要从右开始找
            while (arr[j] >= base && i < j)
                j--;

            //再找左边的
            while (arr[i] <= base && i < j)
                i++;

            //交换两个数在数组中的位置
            if (i < j) {
                let t = arr[i];
                arr[i] = arr[j];
                arr[j] = t;
            }

        }
        //最终基准归位
        arr[left] = arr[i];
        arr[i] = base;
       quickSort1(arr, left, i - 1);
       quickSort1(arr, i + 1, right);
        return arr;
    }

  2)这种是简单的实现方法,左右排序,然后拼接,这种方法不会改变原数组

  Ts代码实现:
export default class SortManager {
    /**
     * 数组快排1
     * @param arr 要排序的数组
    */
    static quickSort(arr: number[]): number[] {
        if (arr.length <= 1) return arr;
        let pivotIndex = Math.floor(arr.length / 2);
        let pivot = arr.splice(pivotIndex, 1)[0];
        let left = [];
        let right = [];
        for (let i = 0; i < arr.length; i++) {
            if (arr[i] < pivot) {
                left.push(arr[i])
            } else {
                right.push(arr[i])
            }
        }
        return SortManager.quickSort(left).concat(pivot, SortManager.quickSort(right));
    }

}
  js的实现:
 function quickSort(arr: number[]): number[] {
        if (arr.length <= 1) return arr;
        let pivotIndex = Math.floor(arr.length / 2);
        let pivot = arr.splice(pivotIndex, 1)[0];
        let left = [];
        let right = [];
        for (let i = 0; i < arr.length; i++) {
            if (arr[i] < pivot) {
                left.push(arr[i])
            } else {
                right.push(arr[i])
            }
        }
        return quickSort(left).concat(pivot,quickSort(right));
    }
 
  
posted @ 2022-03-22 15:06  jiaxin2015  阅读(62)  评论(0编辑  收藏  举报