排序

直接插入排序

    var readline = require('readline');
    const rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout
    });
    rl.on('line', function(line) {

    //直接插入排序

    /**算法思想:
    时间复杂度:
    最坏:序列全部逆序,此时为 O(n^2);
    最好:序列全部正序,此时为 O(n);
    空间复杂度:O(1);*/

    //直接插入排序核心算法
    var array = line.split(' ');
    for(var i=0; i<array.length; i++){
        array[i]= parseInt(array[i]);
    }

    for(var j=1;j<array.length;j++){
        var temp = array[j];
        var res = j-1;
        while (res>=0 && temp<array[res]){
            array[res+1]=array[res];
            --res;
        }
        array[res+1]=temp;
    }
    console.log(array);
});

冒泡排序

    var readline = require('readline');
           const rl = readline.createInterface({
               input: process.stdin,
               output: process.stdout
           });
            rl.on('line', function(line){
                /**
                 * 冒泡排序:
                 * 思想:外循环:n->2,内循环->1-n,前一个数大于后一个数->交换位置
                 * 注意事项:外循环跳出的条件是内循环没有发生元素交换
                 * 最好情况:0(n),最差:O(n^2)
                 */

                 var array = line.split(' ').map(function (p1, p2, p3) {
                     return parseInt(p1);
                 });
                for(var i =array.length; i>=1; i--){
                    var flag = false;
                    for(var j=1;j<=i; j++){
                        if(array[j]<array[j-1]){
                            var temp = array[j];
                            array[j] = array[j-1];
                            array[j-1] = temp;
                            flag=true;
                        }
                    }
                    if(!flag){break}
                }
                console.log(array);
            });

快速排序

var readline = require('readline');
           const rl = readline.createInterface({
               input: process.stdin,
               output: process.stdout
           });
            rl.on('line', function(line){
                /**
                 * 快速排序:
                 * 思想:选择第一个数字做为枢轴,并保存它的值temp,设置两个指针,先从后指针向前扫描,如果遇到比这个数小的,
                 * 覆盖掉前指针所对应的值,再从前指针向后扫描,遇到比这个数大的值覆盖掉后指针对应的值,循环停止条件是:
                 * low=high,最后low/high的值就是temp需要插入的位置,一次排序之后左边的数列所有值小于枢轴,右侧大于枢轴,然后
                 * 再递归对左、右数列进行同样的排序。
                 * 最差情况:0(n^2),平均时间复杂度:O(n*log2n)
                 */
                var array = line.split(' ').map(function (p1, p2, p3) {
                     return parseInt(p1);
                 });
                function test(arr,l,r) {
                 var i=l;
                 var j=r;
                 if(l<r){
                     var temp = arr[l];
                 }
                 while (i!==j){
                    while (i<j && arr[j]>temp) --j;
                     i<j ? arr[i] = arr[j] : arr;
                     while (i<j && arr[i]<temp) ++i;
                     i<j ? arr[j]  = arr[i] : arr;
                 }
                 arr[i]=temp;
                 return i;
             };
                function QuickSort(arr,l,r) {
                    if (l < r) {
                        var i = test(arr, l, r);
                        QuickSort(arr, l, i - 1);
                        QuickSort(arr, i + 1, r);
                        return arr
                    }
                }
                //QuickSort(array,0,array.length-1);
                /*第二种快速排序算法简写
                * 取数组中间元素为枢轴元素
                * 对于每次递归:
                * 保存这个元素,并从该数组中删除这个元素
                * 依次遍历这个数组->比这个数小放在left数组里->比它大放在right数组里
                * 递归left和right数组
                * */
                var QuickSort2 = function(arr){
                    //枢轴取数组中间的元素
                    //注意递归跳出条件
                    if (arr.length <= 1) { return arr; }
                    var targetL = Math.floor(arr.length/2 );
                    var target = arr.splice(targetL,1)[0];
                    var left=[];
                    var right=[];
                    for(var i=0;i<arr.length;i++){
                        arr[i]<target ? left.push(arr[i]) : right.push(arr[i])
                    }
                    return QuickSort2(left).concat([target],QuickSort2(right));
                };

                console.log(QuickSort2(array));
            });

简单选择排序

    var readline = require('readline');
           const rl = readline.createInterface({
               input: process.stdin,
               output: process.stdout
           });
            rl.on('line', function(line){
               var array = line.split(' ').map(function (p1, p2, p3) {
                   return parseInt(p1);
               });
               /*简单选择排序
               * 依次遍历这个数组,对于每个外循环的target,内循环每次从剩下的元素中选择一个最小的元素,分别与target交换
               * */
                for(var i=0; i<array.length; i++){
                    var min =i;
                    for(var j=i+1;j<array.length;j++){
                        if(array[j]<array[min]){
                            min=j;
                        }
                    }
                    var temp = array[i];
                    array[i] = array[min]
                    array[min] = temp;
                }
                console.log(array);

            });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值