各种排序方法(冒泡,快速,插入,选择),二分查找

简介: var list = [25,15,60,24,30,70,10,9,8]; //冒泡排序 function bubble(list) { var len = list.
<script>
    var list = [25,15,60,24,30,70,10,9,8];
    //冒泡排序
    function bubble(list) {
        var len = list.length,n
        for (var i =0;i<len;i++){
            //i为0:可以确定最小值,i为1:确定第二小的值 ...
            for (var j=i+1;j<len;j++){
                if(list[i]>list[j]){
                    n = list[i]
                    list[i] = list[j]
                    list[j] = n
                }
            }
        }
        return list
    }
    //选择排序
    function select(list) {
        var len = list.length,n,min
        for (var i =0;i<len;i++){
            min = list[i]
            for (var j=i+1;j<len;j++){
                if(min>list[j]){
                    n = list[j]
                    list[j] = min
                    min = n
                }
            }
            list[i] = min
        }
        return list
    }
    //快速排序
    function quick(list) {
        if(list.length<=1) return list;
        var left=[],right=[],point;
        point = list.pop();
        for (var i =0 ; i<list.length ; i++){
            if(point<list[i]){
                right.push(list[i])
            }else {
                left.push(list[i])
            }
        }
        return quick(left).concat([point],quick(right))
    }
    //插入排序
    function insert(list) {
        var arr=[list[0]],len=list.length,key,j
        for (var i = 1; i<len;i++){
            key = list[i],j=i-1
            while (j>=0 && key<arr[j]){
                arr[j+1]= arr[j]
                j--
            }
            arr[j+1] = key
        }
        return arr
    }
    //二分查找
    function binaryFind(list,num,start,end) {
        start = start || 0,end = end || list.length;
        var mid = Math.floor((start + end) / 2);
        if(list[mid] == num){
            return mid
        }else if(list[mid]>num){
            return binaryFind(list,num,start,mid)
        }else {
            return binaryFind(list,num,mid,end)
        }
    }
</script>

  

   var arr = [343, 435, 23, 345, 234, 766, 436, 235, 578, 34, 56, 1, 57, 3]

    function Bubble() {
        /*
        * 内层的循环比较相邻的两个数字,比较---交换,将最大值调整到末尾
        * 外层的循环每一次确定一个最大值到末尾
        * */
        var length = arr.length, newArr = arr;
        for (var j = 0; j < length - 1; j++) {
            // 每一轮确认一个最大的值到末尾
            for (var i = 0; i < length - 1 - j; i++) {
                // 对比相邻的两个并且比较替换,最后把大的数字调整到末尾
                if (newArr[i] > newArr[i + 1]) {
                    var temp = newArr[i];
                    newArr[i] = newArr[i + 1]
                    newArr[i + 1] = temp;
                }
            }
        }
        return newArr
    }

    function choose() {
        /*
        * 选择每次最大或者最小的值
        * 把该值调整到开头或者末尾
        * */
        var length = arr.length, newArr = arr;
        for (var j = 0; j < length - 1; j++) {
            var min = j;
            for (var i = j + 1; i < length; i++) {
                if (newArr[min] > newArr[i]) {
                    var temp = newArr[min];
                    newArr[min] = newArr[i]
                    newArr[i] = temp;
                }
            }
        }
        return newArr

    }

    function insert() {
        /*
        * 以第一个为排序完成的的数组
        * 向排序完成数组里面插入值
        * */
        var length = arr.length, newArr = arr;
        for (var j = 1; j < length; j++) {
            var index = j
            for (var i = j - 1; i >= 0; i--) {
                if (newArr[i] > newArr[index]) {
                    var temp = newArr[index];
                    newArr[index] = newArr[i]
                    newArr[i] = temp
                    index = i
                }
            }
        }
        return newArr
    }

    //归并排序
    function merge(leftArr, rightArr) {
        var index = 0, newArr = [], left = 0, right = 0
        while (left < leftArr.length && right < rightArr.length) {
            if (leftArr[left] < rightArr[right]) {
                newArr[index] = leftArr[left]
                left++
            } else {
                newArr[index] = rightArr[right]
                right++
            }
            index++
            if (left == leftArr.length) newArr = newArr.concat(rightArr.slice(right))
            if (right == rightArr.length) newArr = newArr.concat(leftArr.slice(left))
        }
        return newArr
    }
    function mergeSort(arr) {
        /*
        * 归并排序
        * 先分小组排序
        * 然后把多个排好序的数组两两合并排序
        * */
        if (arr.length == 1) return arr;
        var length = Math.ceil(arr.length / 2), left = arr.slice(0, Math.ceil(length)), right = arr.slice(length)
        var leftArr = mergeSort(left), rightArr = mergeSort(right)
        var result = merge(leftArr, rightArr)
        return result
    }


    //堆排序
    function Node() {
        this.left = null;
        this.right = null;
        this.value = null
        this.index = null
    }
    //构建初始堆
    function buildTree(arr) {
        var treeNode, parentNode, nodeList = [], node;
        for (var i = 0; i < arr.length; i++) {
            node = new Node();
            node.value = arr[i]
            node.index = i
            if (!treeNode) {
                treeNode = node;
                nodeList.push(node)
            } else {
                if (!parentNode) parentNode = nodeList.shift()
                if (!parentNode.left) {
                    parentNode.left = node
                    nodeList.push(node)
                } else {
                    parentNode.right = node
                    nodeList.push(node)
                    parentNode = null
                }
            }
        }
        return treeNode;
    }
    //构建最大堆
    function buildMaxStach(node) {
        if (!node) return null
        if (!node.left && !node.right) return node;
        var leftNode = buildMaxStach(node.left), rightNode = buildMaxStach(node.right),temp
        if (leftNode && leftNode.value > node.value) {
            temp = node
            node = leftNode
            leftNode = temp
        }
        if (rightNode && rightNode.value > node.value) {
            temp = node
            node = rightNode
            rightNode = temp
        }
        return node;
    }
    function stackSort(arr) {
        var length = arr.length, newArr,maxNode,temp
        for (var i = 0; i < length; i++) {
            newArr = arr.slice(i);
            maxNode = buildMaxStach(buildTree(newArr))
            temp = arr[i]
            arr[i] = maxNode.value
            arr[maxNode.index+i] = temp
        }
        return arr
    }

  

相关文章
|
6月前
|
搜索推荐
排序(冒泡、选择、插入、希尔、归并、快速)
排序(冒泡、选择、插入、希尔、归并、快速)
|
搜索推荐 Java
排序算法-冒泡、选择、堆、插入、归并、快速、希尔
排序算法-冒泡、选择、堆、插入、归并、快速、希尔
33 0
|
7月前
|
存储 搜索推荐 算法
排序 | 冒泡 插入 希尔 选择 堆 快排 归并 非递归 计数 基数 排序(二)
排序 | 冒泡 插入 希尔 选择 堆 快排 归并 非递归 计数 基数 排序(二)
|
7月前
|
存储 搜索推荐 算法
排序 | 冒泡 插入 希尔 选择 堆 快排 归并 非递归 计数 基数 排序(一)
排序 | 冒泡 插入 希尔 选择 堆 快排 归并 非递归 计数 基数 排序(一)
|
搜索推荐
深入探究常用排序算法:冒泡、插入、选择与快速排序
深入探究常用排序算法:冒泡、插入、选择与快速排序
|
搜索推荐
七个常用的排序算法---快排\归排\希尔\插入\选择\冒泡\堆排(一)
七个常用的排序算法---快排\归排\希尔\插入\选择\冒泡\堆排(一)
98 0
|
存储 搜索推荐 C语言
七个常用的排序算法---快排\归排\希尔\插入\选择\冒泡\堆排(二)
七个常用的排序算法---快排\归排\希尔\插入\选择\冒泡\堆排(二)
71 0
|
搜索推荐 C语言
关于查找(二分查找)和排序(冒泡和快速)
关于查找(二分查找)和排序(冒泡和快速)
126 0
关于查找(二分查找)和排序(冒泡和快速)
|
搜索推荐 算法 C++
C++实现排序 - 01 冒泡、选择、插入和希尔排序
从这一讲开始,我们整理一下常见的十大排序算法,可以按照它们的时间复杂度进行大致的分类。今天先来讲讲平均时间复杂度为 O(n^2^) 的四个排序算法。
154 0
C++实现排序 - 01 冒泡、选择、插入和希尔排序