专栏名称: JavaScript
面向JavaScript爱好人员提供:前端最新资讯、原创内容、JavaScript、HTML5、Ajax、jQuery、Node.js等一系列教程和经验分享。
目录
相关文章推荐
51好读  ›  专栏  ›  JavaScript

JavaScript:十大排序的算法思路和代码实现

JavaScript  · 公众号  · Javascript  · 2019-06-01 19:49

正文

请到「今天看啥」查看全文


] = nums [ j - 1 ];

  • j --;

  • }

  • nums [ j ] = temp ;

  • }

  • }

  • 快速排序

    选择一个元素作为基数(通常是第一个元素),把比基数小的元素放到它左边,比基数大的元素放到它右边(相当于二分),再不断递归基数左右两边的序列。

    最好: O ( n * logn ) ,所有数均匀分布在基数的两边,此时的递归就是不断地二分左右序列。
    最坏: O ( n ²) ,所有数都分布在基数的一边,此时划分左右序列就相当于是插入排序。
    平均: O ( n * logn )

    参考学习链接:
    算法 3:最常用的排序——快速排序
    三种快速排序以及快速排序的优化

    快速排序之填坑

    从右边向中间推进的时候,遇到小于基数的数就赋给左边(一开始是基数的位置),右边保留原先的值等之后被左边的值填上。

    1. function quickSort(nums) {

    2. // 递归排序基数左右两边的序列

    3. function recursive(arr, left, right) {

    4. if(left >= right) return;

    5. let index = partition(arr, left, right);

    6. recursive(arr, left, index - 1);

    7. recursive(arr, index + 1, right);

    8. return arr;

    9. }

    10. // 将小于基数的数放到基数左边,大于基数的数放到基数右边,并返回基数的位置

    11. function partition(arr, left, right) {

    12. // 取第一个数为基数

    13. let temp = arr[left];

    14. while(left < right) {

    15. while(left < right && arr[right] >= temp) right--;

    16. arr[left] = arr[right];

    17. while(left < right && arr[left] < temp) left++;

    18. arr[right] = arr[left];

    19. }

    20. // 修改基数的位置

    21. arr[left] = temp;

    22. return left;

    23. }

    24. recursive(nums, 0, nums.length-1);

    25. }

    快速排序之交换

    从左右两边向中间推进的时候,遇到不符合的数就两边交换值。

    1. function quickSort1(nums) {

    2. function recursive(arr, left, right) {

    3. if(left >= right) return;

    4. let index = partition(arr, left, right);

    5. recursive(arr, left, index - 1);

    6. recursive(arr, index + 1, right);

    7. return arr;

    8. }

    9. function partition(arr, left, right) {

    10. let temp = arr[left];

    11. let p = left + 1;

    12. let q = right;

    13. while(p <= q) {

    14. while(p <= q && arr[p] < temp) p++;

    15. while(p <= q && arr[q] > temp) q--;

    16. if(p <= q) {

    17. [arr[p], arr[q]] = [arr[q], arr[p]];

    18. // 交换值后两边各向中间推进一位

    19. p++;

    20. q--;

    21. }

    22. }

    23. // 修改基数的位置

    24. [arr[left], arr[q]] = [arr[q], arr[left]];

    25. return q;

    26. }

    27. recursive(nums, 0, nums.length-1);

    28. }

    归并排序

    递归将数组分为两个序列,有序合并这两个序列。

    最好: O ( n * logn )
    最坏: O ( n * logn )
    平均: O ( n * logn )

    参考学习链接:
    图解排序算法(四)之归并排序

    1. function mergeSort(nums) {

    2. // 有序合并两个数组

    3. function merge(l1, r1, l2, r2) {

    4. let arr = [];

    5. let index = 0;







    请到「今天看啥」查看全文


    推荐文章
    叶子猪游戏网  ·  阅邪恶 | 不忍直视的雕像
    8 年前
    水木文摘  ·  有人偷偷爱着你
    8 年前
    淘股吧  ·  如何应对渐进式股灾
    8 年前