zoukankan      html  css  js  c++  java
  • 数组及排序(冒泡、选择、快速排序)

    01.数组基础

    1.数组

    使用单独的变量名来存储一系列的值

    简单的说,数组的作用,就是一个容器,将多个数据保存起来

    2.声明数组的方法

    1. 字面量 :

      var arr = [];
      eg:
      var arr = ["兔子1","兔子2","兔子3","兔子4"];
      console.log(arr);
    2. 构造函数方法:

      var arr = new Array();
      如果参数为一个数值:代表的是数组中的长度
         如果为多个值,则是数组内容
      eg:
      var arr = new Array(1,2,3,4);
      console.log(arr);

    3.数组的取值

    1. 利用数组的下角标 eg:arr[0] arr[1];

    2. 数组里面的下标都是连续的

    eg:
    //取值
    var arr = ["兔子1","兔子2","兔子3","兔子4"];
    console.log(arr[0]);

    //获取数组长度
    console.log(arr.length);

    //重新赋值
    var arr = [1,2,3,4,5,6];
    arr[3] = 10;
    console.log(arr);

    02.数组的遍历

    1.遍历数组

    根据数组的下标,从开始往后扫描,直到结束

    2.遍历方法

    (1) for 循环

    (2) for in 循环 for in 常用来遍历对象

    eg:
    var arr = [1,2,3,4,5,6];
    //for循环
    for(i = 0 ; i < arr.length ; i++){
       console.log(arr[i]);
    }

    //for in循环
    for(i in arr){
       console.log(arr[i]);
    }
    练习:
    0、求data数组中所有数字的和
    var arr = [1,2,3,4,5];
    function arrSum(arr){   //arr形参
       var sum = 0;
       for(var i = 0 ; i < arr.length ; i++){
           sum += arr[i];
      }
       return sum;
    }
    console.log(arrSum(arr));    //arr实参

    1、求平均成绩。

    var arr = [1,2,3,4,5];
    function fn(arr){
       var sum = 0;
       for (var i = 0 ; i < arr.length ; i++){
           sum += arr[i];
      }
       return sum / arr.length;
    }
    console.log(fn(arr));

    2、把1 - 100 放在数组data中;

    var arr = [];
    for(var i = 0 ; i < 100 ; i++){
       arr[i] = i + 1;
    }
    console.log(arr);

    3:随机点名程序Math.random()

    var arr = ["disf","dfg","fdre","fh","gh"];
    var randomIndex = parseInt(Math.random() * arr.length);   //下标
    console.log(arr[randomIndex]);  

    4. 编写函数map(arr) 把数组中的每一位数字都增加30%

       var arr = [1,2,3,4,5];
    function map(arr){
       for(i = 0 ; i < arr.length ; i++){
           arr[i] *= 1.3;
      }
       return arr
    }
    console.log(map(arr));

    5. 编写函数has(arr) 判断数组中是否存在60这个元素,返回布尔类型

    方法一:
    function has(arr,k){
       for(var i = 1 ; i < arr.length ; i++){
           if(arr[i] == k){
               return true;
          }
      }
       return false;
    }
    console.log(has([1,2,3,4,5],33));

    方法二:
    function has(arr, k) {
       var flag = false;
       for(var i = 0 ; i < arr.length ; i++){
           if(arr[i] == k){
               flag = true;
               break;
          }
      }
       if(flag){
           return "包含数字" + k;
      }else{
           return "不包含数字" + k;
      }
    }
    console.log(has([1,2,3,4,5],33));

    6、把1 - 100 中能被3 5 整除的的数放在数组中

    //方法一:
    var arr = [],
       index = 0;   //由于数组下标是连续的,但是得到的结果是不连续的,所以,需要设置索引值,来代表下标
    for(var i = 1 ; i <= 100 ; i++){
       if(i % 3 == 0 && i % 5 == 0){
           arr[index] = i;
           index++;
      }
    }
    console.log(arr);

    //方法二:
    var arr = [];
    for(var i = 1 ;i <= 100 ; i++){
       if(i % 3 == 0 && i % 5 == 0){
           arr.push(i);
      }
    }
    console.log(arr);

    03.数组的api

    push()  在最后添加
    pop()   取出最后一个

    unshift()  在前面添加
    shift()    取出第一个

    reverse()   反转

    sort()   方法,对数组排序
    参数为一个回调函数!!!
       如果没有参数:则是按照第一位ASCII码排列;

    eg:
    var arr = [5,2,1,7,6,10];
    arr.sort(function(val1,varl2){
       return varl1 - val2;
    });
    console.log(arr);

    arr.push(333);
    console.log(arr);

    04.数组的api2

    concat()  数组的拼接,不会对原数组造成影响
    join("")  将数组分割字符串,按照所填的字符。不会对原数组造成影响
    toString()  将数组转成字符串
    slice()   按照下标,数组的截取,不包括end ,不会对原数组造成影响
    splice(start,deleteCount,arr)  从start开始,删除几个,arr新插入的数组元素。改变原数组

    eg:
    var arr1 = [1,2,3,4];
    var arr2 = [2,3,4,3];
    var newArr = arr1.concat(arr2);
    console.log(newArr);       //newArr[8]


    var arr1 = [1,2,3,4];
    console.log(arr1.join("-"));    //1-2-3-4

    var arr1 = [1,2,3,4];
    console.log(arr1.toString());   //1,2,3,4

    var arr1 = [1,2,3,4,5,6]; console.log(arr1.slice(0,3));   //[1,2,3];

    var arr1 = ["nihao" , "www" , "kkk" , "ttt" , "dadsf"];
    arr1.splice(1,3,'9994');
    console.log(arr1);    //["nihao", "9994", "dadsf"]

    05.数组的排序

    1.冒泡排序

    var arr = [9,8,7,6,5,2,1];
    /*冒泡排序
          9,8,11,6,5,2,1

              第一轮:
                  8   9   11 6   5   2   1
                  8   9   11 6   5   2   1
                  8   9   6   11 5   2   1
                  8   9   6   5   11 2   1
                  8   9   6   5   2   11 1
                  8   9   6   5   2   1   11

              第二轮:
                  8   9   6   5   2   1
                  8   6   9   5   2   1
                  8   6   5   9   2   1
                  8   6   5   2   9   1
                  8   6   5   2   1   9

              第三轮:
                  8   6   5   2   1
                  6   8   5   2   1
                  6   5   8   2   1
                  6   5   2   8   1
                  6   5   2   1   8

              第四轮:
                  6   5   2   1
                  5   6   2   1
                  5   2   6   1
                  5   2   1   6

              第五轮:
                  5   2   1
                  2   5   1
                  2   1   5

              第六轮:
                  2   1
                  1   2


          */

    //冒泡排序
    var arr = [2,3,4,6,2,0,4,3];
    function bubbleSort(arr){
       //确定循环的轮数
       for(var i = 0 ; i < arr.length - 1 ; i++){
           //每一轮 数值的比较(两两比较的,每一轮最后一个都不用比较,所以-i;得到的最后一个和空的undefined比较了,所以-1,不用比较,提高算法的效率)
           for(var k = 0 ; k < arr.length - i - 1 ; k++){
               //谁大谁往后排
               if(arr[k] > arr[k+1]){
                   var temp = arr[k];
                   arr[k] = arr[k+1];
                   arr[k+1] = temp;
              }
          }
      }
       return arr;
    }
    console.log(bubbleSort(arr));

    2.选择排序

    /*
    选择排序(打擂台)
              var arr = [6,5,1,3,2]

                  6   5   1   3   2

              第一轮:
                  5   6   1   3   2
                  1   6   5   3   2
                  1   6   5   3   2
                  1   6   5   3   2

              第二轮:
                  6   5   3   2
                  5   6   3   2
                  3   5   6   2
                  2   5   6   3

              第三轮:
                  5   6   3
                  5   6   3
                  3   6   5

              第四轮:
                  6   5
                  5   6


          */

    //选择排序
    var arr = [2,3,4,6,2,0,4,3];
    function chooseSort(arr){
       //确定循环的轮数(几轮)
       for(var i = 0 ; i < arr.length - 1 ; i++){
           //每一轮都和第一个位置的数值比较(让后面的都与第一位比较,所以是从i+1位开始,)
           for(var k = i + 1 ; k < arr.length ; k++){
               //谁小谁往前排(让每轮的第一位与后面的数进行比较.每一轮比较完得到较小的,就不再比较。确定了第一位arr[i])
               if(arr[i] > arr[k]){
                   var temp = arr [i];
                   arr[i] = arr[k];
                   arr[k] = temp;
              }
          }
      }
       return arr;
    }
    console.log(chooseSort(arr));

    3.快速排序

    var arr = [10,30,50,20,40,70];
    /*
              快速排序:
              [10 30]   (50) [20 40 70]         //取中间的一个值,让中间位置的值(50)与每一个值进行比较,自身不用和自身比较,直接continue跳出本次循环。
              [10 30]   ((20)) [40 (50) 70]       //小于等于中间值(50)的放在中间值的左侧,大的放在右侧,左侧重新确定中间位置的值为((20))
              [10] ((20))   [30 40 50 70]         //重复上述步骤,将((20))右侧重新确定中间位置,然后进行比较得到结果.....
              .....
          */

    var arr = [3,2,8888,5,55,5,88,777777,11];
    function quickSort(arr){
       //递归结束条件
       if(arr.length <= 1){
           return arr;
      }
       //取中间的值以及中间的下标
       var
       midIndex = parseInt(arr.length / 2),    //取中间的下标
           midValue = arr[midIndex],        //取中间的值
           leftArr = [],    //创建左右的数组
           rightArr = [];

       //遍历arr数组。每一个值和中间的值相比较,大的放右侧数组。小的等的放左侧
       for(var i = 0 ; i < arr.length ; i++){
           //如果是中间下标的,跳出本次循环,(不用中间值和自身比较)
           if(i == midIndex){
               continue;
          }
           if(arr[i] <= midValue){
               leftArr.push(arr[i]);
          }else{
               rightArr.push(arr[i]);
          }
      }
       //利用递归处理左右的数组
       var res = quickSort(leftArr).concat(midValue).concat(quickSort(rightArr));
       return res;
    }
    console.log(quickSort(arr));

    06.二维数组

    //var arr = [1,2,3,4,4];  一维数组

    var arr = [
      [1,2,3],
      [4,5,6],
      [7,8,9],
      [10,11,12]
    ]
    //取值
    for(var i = 0 ; i < arr.length ; i++){
       for(var k = 0 ; k < arr[i].length ; k++){
           console.log(arr[i][k]);
      }
    }
  • 相关阅读:
    值类型、引用类型作为方法参数如何执行,ref与out的区别
    asp.net 常用 验证正则表达式
    ASP.NET的错误处理机制
    MSSQL与MYSQL区别
    http协议状态码对照表
    EF 跨数据库支持
    请求管道中的19个事件
    一位软件工程师的6年总结本人读了深受启发,献给所有从事IT开发的人 [转载]
    Windows 窗体的.Net 框架绘图技术
    Windows Live Messenger 8.5 去广告方法及资源文件
  • 原文地址:https://www.cnblogs.com/ljp1997/p/11442785.html
Copyright © 2011-2022 走看看