zoukankan      html  css  js  c++  java
  • 排序算法整理

    一、排序算法的分类

    1.插入类排序

    军训时,在一只有序队伍中,新来一个,教官要求新来的迅速找到自己的位置。

    例:直接插入排序折半插入排序

    2.交换类排序

    军训刚开始,一群新生需要排队,教官说,“你比你旁边的高,你俩换一下,怎么换完还高,再换......”

    例:冒泡排序快速排序

    3.选择类排序

    每一趟选出最小(或最大)的一个。比如军训排队,教官说,“你们都别动,我看看谁个字最小,你和第一个换一下,剩下的我继续选......”

    例:简单选择排序堆排序

    4.归并类排序

    将两个或两个以上的有序序列合并成一个新的有序序列。继续军训排队,教官让每个人和旁边的人组成一个二人组,二人组内部先排好,二人组再和旁边的二人组组成新的四人组,依旧内部排序...... 最终会合并到一个组。

    例:二路归并排序

    5.基数类的排序

    基于多关键字排序的思想。例如,一副去掉大小王的52张扑克牌进行基数排序,先按花色(红桃、黑桃、方片、梅花)排序,这样分成了4堆,然后每一堆从 A 到 K 排序。

    二、JavaScript排序算法实现

    1.直接插入排序

    let arr = [49, 38, 65, 97, 76, 13, 27, 49]
    let i = 0
    let temp, j
    let n = arr.length
    /*非递减排序*/
    for (i+1; i<n; i++) {
        temp = arr[i]
        j = i-1
        while (j>=0 && temp<arr[j]) {
            arr[j+1] = arr[j]
            --j
        }
        arr[j+1] = temp
    }
    console.log(arr)     //[13, 27, 38, 49, 49, 65, 76, 97]

    2.希尔排序

    let arr = [49, 38, 65, 97, 76, 13, 27, 49, 55, 4]
    let gaps = [5, 3, 1]
    let i = 0, j = 0, n = 0, temp
    /*非递减排序*/
    for (n; n<gaps.length; n++) {
        for (i=gaps[n]; i<arr.length; i++) {
            temp = arr[i]
            for (j=i; j>=gaps[n] && arr[j-gaps[n]]>temp; j=j-gaps[n]) {
                arr[j] = arr[j-gaps[n]]
            }
            arr[j] = temp
        }
    }

    3.冒泡排序

    let arr = [49, 38, 65, 97, 76, 13, 27, 49, 55, 4]
    let i = 0
    let j = 0
    /*非递减排序*/
    for (i; i<arr.length; i++) {
        for (j=i+1; j<arr.length; j++) {
            if (arr[i]>arr[j]) {
                let k = arr[i]
                arr[i] = arr[j]
                arr[j] = k 
            }
        }
    }

    4.快速排序

    let arr = [49, 38, 65, 97, 76, 13, 27, 49, 55, 4]
    /*非递减排序*/
    function quickSort (arr_) {
        let left =[]
        let right = []
        let m, temp
        let i=0
        if (arr_.length<=1) {
            return arr_
        }
        m = Math.floor(arr_.length/2)
        temp = arr_.splice(m, 1)
        for (i; i<arr_.length; i++) {
            if (arr_[i]<temp) {
                left.push(arr_[i])
            } else {
                right.push(arr_[i])
            }
        }
        console.log('left:'+left)
        console.log('right:'+right)
        console.log('temp:'+temp)
        return quickSort(left).concat(temp, quickSort(right))
    }
    console.log(quickSort(arr))

    5.选择排序

    let arr = [49, 38, 65, 97, 76, 13, 27, 49, 55, 4]
    let i = 0
    let j = 0
    let k, temp
    /*非递减排序*/
    for (i; i<arr.length; i++) {
        min_ = arr[i]
        k = i
        for (j=i+1; j<arr.length; j++) {
            if (arr[j]<min_) {
                min_ = arr[j]
                k = j
            }
        }
        temp = arr[i]
        arr[i] = min_
        arr[k] = temp
    }
    console.log(arr)

    分类参考天勤计算机考研高分笔记系列第8版,2020版数据结构

    JavaScript算法参考简书 https://www.jianshu.com/p/da9e31c485c2

  • 相关阅读:
    快速开始使用Graph-tool
    graph-tool文档(一)- 快速开始使用Graph-tool
    graph-tool文档(一)- 快速开始使用Graph-tool
    graph-tool文档(一)- 快速开始使用Graph-tool
    -bash: /bin/rm: Argument list too long的解决办法【转】
    SELinux 入门【转】
    gnuplot生成MySQL QPS图形
    mysql状态查看 QPS/TPS/缓存命中率查看【转】
    Mysql中truncate table和delete语句的区别
    Linux(Centos )的网络内核参数优化来提高服务器并发处理能力【转】
  • 原文地址:https://www.cnblogs.com/zhuxingqing/p/11211089.html
Copyright © 2011-2022 走看看