数据结构-排序

排序算法可以说是学习数据结构所必须的了,今天就将数据结构的排序算法整理一下,方便以后的整理和学习。

一、冒泡排序

描述:首先找出数组中最大或者最小的一个数将它放到最后,然后依次找出第二大或者小的数放在倒数第二的位置,如此循环n-1次,就可排序。

 <script>
        var data = [72,54,58,30,31,78,2,77,82,72];
        var length = data.length;
        var start = new Date().getTime();
        for(var i=0;i<length-1;i++){
          for(j=i+1;j<length;j++){
              if(data[i]>data[j]){
                  var buffer = data[i];
                  data[i] = data[j];
                  data[j]=buffer;
              }
          }

        }
        var stop = new Date().getTime();
        var elapsed = stop - start;
        console.log(data);
        console.log(elapsed);

    </script>

 

二、选择排序

描述:首先将数组的第一个数设置为最小值min=a[0];然后向后依次比较每一个数,如果比min小则将两个数交换(看你是从小到大排序还是从大到小排序),然后将min往后移一位min=a[1],如此循环,直至排序完成。

 

    <script>
        var data = [72,54,58,30,31,78,2,77,82,72];
        var length = data.length;
        var start = new Date().getTime();
        //设置最小值
        var min ;
        for(var i=0;i<=length-2;i++){
            //将数组的第一个数赋值给min
            min = i;
            // 一次比较找出比min还小的数并将两个值进行交换
          for(j=i+1;j<=length-1;j++){
             if(data[min]>data[j]){
                 min = j;
             }
          }
            // 将min最小值放在第i的位置
          var buffer = data[i];
            data[i] = data[min];
            data[min]=buffer;
        }
        // 设置运算停止的时间
        var stop = new Date().getTime();
        // 计算算法所用的时间
        var elapsed = stop - start;
        console.log(data);
        console.log(elapsed);
    </script>

三、快速排序

描述:

先从数列中取出一个数作为基准数(一般为中间的一个数);分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边;再对左右区间重复第二步,直到各区间只有一个数。有点分治法和递归的思想。

 案例:3 6 5 8 4 2 1 9
快排过程:

3 6 5 8 4 2 1 9 =>

2 1 |3| 6 5 8 4 9 => 

1 |2| |3| 5 4 |6| 8 9 => 

1 |2| |3| 4 |5| |6| |8| 9 => 

1 2 3 4 5 6 8 9

<script>
    function quickSort(arr){
        if(arr.length<=1){
            return arr;//如果数组只有一个数,就直接返回;
        }
        var num = Math.floor(arr.length/2);//找到中间数的索引值,如果是浮点数,则向下取整
        var numValue = arr.splice(num,1);//找到中间数的值并将其删除
        var left = []; //创建左、右数组
        var right = [];
        for(var i=0;i<arr.length;i++){
            if(arr[i]<numValue){
                left.push(arr[i]);//基准点的左边的数传到左边数组
            }
            else{
                right.push(arr[i]);//基准点的右边的数传到右边数组
            }
        }
        return quickSort(left).concat([numValue],quickSort(right));//递归不断重复比较并将左右数组与基准数链接起来
    }
    console.log(quickSort([32,45,37,16,2,87]));//“2,16,32,37,45,87”
</script>

四、插入排序

描述:

假设第一个数是有序的,那么把后面的数拿出来插入到这个有序数的合适位置,假设是升序(比第一个数小则向后移动第一个数,将数插入到第一个数的前面),插入后有序区间扩大为两个,依次向后,不断拿出新的数插入到有序区间,再扩大这个有序区间直至区间大小等于排序数组的大小。

 <script>
        var data = [72,54,58,30,31,78,2,77,82,72];
        var length = data.length;
        var start = new Date().getTime();
        for(var i=1;i<length;i++){
            // 将当前数与之前的数进行比较,当碰到比他小的,就将当前数与之交换
            while(i-1>=0&&data[i]<data[i-1]){
                    var temp =data[i];
                     data[i] = data[i-1];
                     data[i-1]=temp;
                i--;
            }
        }

        var stop = new Date().getTime();
        var elapsed = stop - start;
        console.log(data);
        console.log(elapsed);

    </script>

 

 

参考文章1

参考文章2

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值