排序算法

一、排序算法

排序算法有:冒泡排序、选择排序、插入排序、归并排序、计数排序、基数排序、希尔排序、堆排序、桶排序。

二、冒泡算法

function ArrayList() {
    var arr = [];
    // 数组中插入数据
    this.insert = function(num) {
        return arr.push(num);
    }
    // 打印arr
    this.print = function() {
        console.log(arr);
    }
    // 互换位置
    function swap(num1, num2) {
        var temp = arr[num1];
        arr[num1] = arr[num2];
        arr[num2] = temp;
    }
    // 冒泡排序
    this.bubbleSort = function() {
        for(var j = arr.length - 1; j > 0; j --) {
            for(var i = 0; i < j; i++) {
                if(arr[i] > arr[i + 1]) {
                    swap(i, i+ 1);
                }
                console.log('第一个for',arr)
            }
            console.log('第2个for',arr)
        }
    }
}

 

三、选择排序

this.selection = function() {
        for (var j = 0; j < arr.length-1; j ++) {
            // 最小值的索引
            var minIndex = j;
            for(var i = j + 1;  i < arr.length; i ++ ) {
                if(arr[j] > arr[i]) {
                    minIndex = i;
                }                
            }
            swap(minIndex,j);            
        }
}

四、插入排序

this.insertionSort = function(){
        for(var i = 1; i < arr.length; i ++) {
            var j = i;
            // 把arr[i]拎出来与前面的一个一个比较,大于arr[i]的往后移一步
            var temp = arr[i];
            while(arr[j-1] > temp && j > 0) {
                arr[j] = arr[j-1];
                j --;
            }
            arr[j] = temp;
            console.log(arr);
        }
    }

 

 

五、希尔排序

 

this.shellSort = function() {
        // 初始化间隔
        var gap = Math.floor(arr.length / 2);

        while(gap >= 1) {
            // gap作为间隔进行分组,对分组进行插入排序
            for(var i = gap; i< arr.length; i ++ ) {
                var temp = arr[i];
                var j = i;
                // 分隔的某一组数进行插入排序
                while(arr[j - gap] > temp && j > gap - 1) {
                    arr[j] = arr[j - gap];
                    j -= gap;
                }
                this.arr[j] = temp;
            }
            // 将gap改为原来的一半,继续循环
            gap = Math.floor(gap / 2);
        }
}

 

六、快速排序

// 1.选择枢纽
    function median (left, right) {
        // 算出中间位置
        var center = Math.floor((left + right) / 2);

        // 这三个值按从小到大交换位置
        if(arr[left] > arr[center]) {
            swap(left, center);
        }
        if(arr[center] > arr[right]) {
            swap(center, right);
        }
        if(arr[left] > arr[right]) {
            swap(left, right);
        }
        if(arr[left] > arr[center]) {
            swap(left, center);
        }

        // 将center换到right-1的位置
        swap(center, right - 1);
            console.log(arr)

    }

    // 递归方法
    function quick (left, right) {
        // 结束条件
        if(left >= right) return;

        // 获取枢纽
        var pivot = median(left, right);
        // 设置左右指针
        var leftPoint = left;
        var rightPoint = right - 1;

        // 开始指针查找并交换位置:左指针找到大于枢纽的停下来,右指针找到小于枢纽的停下来
        while(true) {
            while(arr[++leftPoint] < pivot) {}
            while(arr[--rightPoint] > pivot) {}
            // 如果左指针大于右指针,则互换位置
            if(leftPoint > rightPoint) {
                swap(leftPoint, rightPoint);
            } else {
                break;
            }
        }

        // 将枢纽放置在正确位置,即leftPoint
        swap(leftPoint, right - 1);

        // 左右两块分别递归调用
        quick(left, leftPoint - 1);
        quick(leftPoint + 1, right);

    }
    // 快速排序
    this.quickSort = function() {
        quick(0, arr.length - 1);
        console.log(arr);
    }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值