js算法学习

js算法

要求:我有一列 数字要按照从小到大的顺序将他们排好

1.冒泡排序

冒泡思路:把数字拎出来,两个两个之间进行比较,如果发现大的就把他放到后面,这样做就能保证每一次我都能找到最大的一组数字放到最后面

举例说明:要排序数组:int[] arr={6,3,8,2,9,1};

第一趟排序:

    第一次排序:6和3比较,6大于3,交换位置: 3 6 8 2 9 1

    第二次排序:6和8比较,6小于8,不交换位置:3 6 8 2 9 1

    第三次排序:8和2比较,8大于2,交换位置: 3 6 2 8 9 1

    第四次排序:8和9比较,8小于9,不交换位置:3 6 2 8 9 1

    第五次排序:9和1比较:9大于1,交换位置: 3 6 2 8 1 9

    第一趟总共进行了5次比较, 排序结果: 3 6 2 8 1 9

---------------------------------------------------------------------

第二趟排序:

    第一次排序:3和6比较,3小于6,不交换位置:3 6 2 8 1 9

    第二次排序:6和2比较,6大于2,交换位置: 3 2 6 8 1 9

    第三次排序:6和8比较,6大于8,不交换位置:3 2 6 8 1 9

    第四次排序:8和1比较,8大于1,交换位置: 3 2 6 1 8 9

    第二趟总共进行了4次比较, 排序结果: 3 2 6 1 8 9

---------------------------------------------------------------------

第三趟排序:

    第一次排序:3和2比较,3大于2,交换位置: 2 3 6 1 8 9

    第二次排序:3和6比较,3小于6,不交换位置:2 3 6 1 8 9

    第三次排序:6和1比较,6大于1,交换位置: 2 3 1 6 8 9

    第二趟总共进行了3次比较, 排序结果: 2 3 1 6 8 9

---------------------------------------------------------------------

第四趟排序:

    第一次排序:2和3比较,2小于3,不交换位置:2 3 1 6 8 9

    第二次排序:3和1比较,3大于1,交换位置: 2 1 3 6 8 9

    第二趟总共进行了2次比较, 排序结果: 2 1 3 6 8 9

---------------------------------------------------------------------

第五趟排序:

    第一次排序:2和1比较,2大于1,交换位置: 1 2 3 6 8 9

    第二趟总共进行了1次比较, 排序结果: 1 2 3 6 8 9

---------------------------------------------------------------------

最终结果:1 2 3 6 8 9

---------------------------------------------------------------------

由此可见:N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-i)次,i为当前的躺数,所以可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数,

var examplearr=[8,94,15,88,55,76,21,39];
function sortarr(arr){
    for(i=0;i<arr.length-1;i++){
        for(j=0;j<arr.length-1-i;j++){
            if(arr[j]>arr[j+1]){
                var temp=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=temp;
            }
        }
    }
    return arr;
}
sortarr(examplearr);
console.log(examplearr);

如何理解内外层循环?

内外层循环的实质是类似于物理当中的控制变量,列如我手上同时有两个变量,这两个变量是会变动的,那么我需要控制其中一个变量不动(外层i),那么i不动以后,我的里层j开始自己变动,当我j完成一次满状态后,我就退出当前的内层循环,进入下一次外层,此时i就从0开始+1,然后重复这一过程,直到我的i外层也满状态,则退出所有循环

2.选择排序

挑选第一个数作为参考目标,然后用其他的数与他比较,挑出最小的数字放前面,之后从第二个数字开始,依次循环

简单选择排序的基本思想:给定数组:int[] arr={里面n个数据};第1趟排序,在待排序数据arr[1]~arr[n]中选出最小的数据,将它与arrr[1]交换;第2趟,在待排序数据arr[2]~arr[n]中选出最小的数据,将它与r[2]交换;以此类推,第i趟在待排序数据arr[i]~arr[n]中选出最小的数据,将它与r[i]交换,直到全部排序完成。

举例:数组 int[] arr={5,2,8,4,9,1};

-------------------------------------------------------

第一趟排序: 原始数据:5 2 8 4 9 1

最小数据1,把1放在首位,也就是1和5互换位置,

排序结果:1 2 8 4 9 5

-------------------------------------------------------

第二趟排序:

第1以外的数据{2 8 4 9 5}进行比较,2最小,

排序结果:1 2 8 4 9 5

-------------------------------------------------------

第三趟排序:

除1、2以外的数据{8 4 9 5}进行比较,4最小,8和4交换

排序结果:1 2 4 8 9 5

-------------------------------------------------------

第四趟排序:

除第1、2、4以外的其他数据{8 9 5}进行比较,5最小,8和5交换

排序结果:1 2 4 5 9 8

-------------------------------------------------------

第五趟排序:

除第1、2、4、5以外的其他数据{9 8}进行比较,8最小,8和9交换

排序结果:1 2 4 5 8 9

function selectSort(arr){
            var len=arr.length;
            var temp;
            for(var i=0;i<len-1;i++){
                for(var j=i+1;j<len;j++){
                    if(arr[j]<arr[i]){
                        temp=arr[j];
                        arr[j]=arr[i];
                        arr[i]=temp;
                    }
                }
                i++;
            }
            return arr;
        }

3.插入排序

插入排序的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入,因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

步骤:

一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:

<1> 从第一个元素开始,该元素可以认为已经被排序;

<2> 取出下一个元素,在已经排序的元素序列中从后向前扫描;

<3> 如果该元素(已排序)大于新元素,将该元素移到下一位置;

<4> 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;

<5> 将新元素插入到该位置后;

<6> 重复步骤2~5。

function insertSort(arr) { 
    for (var i = 1; i < arr.length; i++) { 
      var temp = arr[i]; 
      var j = i - 1; 
      while (j >= 0 && arr[j] > temp) { 
        arr[j + 1] = arr[j]; 
         j--; 
      } 
      arr[j + 1] = temp; 
    } 
    return arr; 
 } 
var arr = [1, 45, 37, 5, 48, 15, 37, 26, 29, 2, 46, 4, 17, 50, 52]; 
console.log(insertSort(arr));    

开关思想:数组去重

<script>
    var arr = [20,25,66,78,25,66,39];//【20,25,66,78,39】

    //1.声明一个空数组,存储不重复的元素
    var newArr = [];
    //2.遍历arr
    for(var i = 0;i<arr.length;i++){
        //3.检查arr[i]是否在newArr中,如果不在就添加,在就不添加(结果只有两种情况,要么在,要么不在)
        var canAdd = true;//假设可以添加
        /*遍历newArr,看newArr中是否有元素与arr[i]相等
         */
        for(var j = 0;j<newArr.length;j++){//验证开关的状态
            if(newArr[j] == arr[i]){
                //arr[i]在newArr中,此时不添加
                canAdd = false;
                break;//只要有重复元素,后面元素没有比较的必要
            }
        }

        if(canAdd == true){//如果开关状态是true,则添加
            newArr[newArr.length] = arr[i];
        }
    }

    console.log ( newArr );

    /*开关思想
    1.当某种情况的结果只有两种情况(开关思想,声明一个布尔类型的值表示开关)
    2.随便假设开关一种状态
    3.验证你的状态

     */
</script>

求数组中的最大值

 function getMaxNum (arr  ) {
        var max = -Infinity;
        for(var i = 0;i<arr.length;i++){
            if(arr[i] > max){
                max = arr[i];
            }
        }

        return max;
    }

   var max1 =  getMaxNum([10,-50,88,99,100]);
    console.log ( max1 );

    console.log ( getMaxNum ( [ 90, 88, 60, 200 ] ) );

 

转载于:https://my.oschina.net/u/4004801/blog/3009369

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值