zoukankan      html  css  js  c++  java
  • 常用排序方法总结

    直接插入排序

    <script>
         var arr=[33,12,3,2,1,0,67];  //待排序的数组
         function sortArr(curArr){
             //为了便于排序,将待排序的数组copy一份,第0个位置用来放岗哨元素,为了辅助排序
             var newArr=[];//为了实现插入排序的辅助数组
             var resultArr=[];//存排好序的元素
             for(var i=0;i<curArr.length;i++){
                 newArr[i+1]=curArr[i];
             }
             //下面为直接插入排序的算法开始
             for(var i=2;i<newArr.length;i++){
                  if(newArr[i]<newArr[i-1]){//为了优化算法,避免当关键字curArr[i]已是当前最大的记录关键字时还要进行不必要的操作
                      //当第i个元素小于第i-1个元素时,意味着要进行插入排序
                      newArr[0]=newArr[i];//因为后面要进行移位,所以先保存第i个元素(即:监视哨备份待查记录)
                      for(var j=i-1;newArr[0]<newArr[j];j--){
                           newArr[j+1]=newArr[j];
                           newArr[j]=newArr[0];
                      }
                  }
             }
         //直接插入排序算法结束
    //因为newArr的第0个元素为辅助排序的,为了输出美观,又对newArr数组进行了一次复制 for(var i=1;i<newArr.length;i++){ resultArr[i-1]=newArr[i]; } return resultArr; } var reArr=sortArr(arr); console.log('原来的数组'+arr.join(',')); console.log('排序后的数组'+reArr.join(','));
    </script>

    折半插入排序

    <script>
         var arr=[33,12,3,2,1,0,67,98,12];  //待排序的数组
         function sortArr(curArr){
            //为了便于排序,将待排序的数组copy一份,第0个位置用来放岗哨元素,为了辅助排序
            var newArr=[];//为了实现插入排序的辅助数组
            var resultArr=[];//存排好序的元素
            var low;//查找区间的下界
            var high;//查找区间的上界
            var mid;//查找区间的中间位置
            for(var i=0;i<curArr.length;i++){
                 newArr[i+1]=curArr[i];
            }
            //下面为折半插入的算法开始
            for(var i=2;i<newArr.length;i++){
                  if(newArr[i]<newArr[i-1]){
                       //需要进行移位
                       newArr[0]=newArr[i];//监视哨备份待查记录
                       low=1;
                       high=i-1;
                       //下面为折半查找第i个元素的插入位置
                       while(low<=high){
                            mid=Math.floor((high+low)/2);//确定待查找范围的中间位置
                            if(newArr[0]<newArr[mid]){
                                //当待查找元素在表的前半部分时
                                 high=mid-1;
                            }else{
                                 //当待查找元素在表的后半部分时
                                 low=mid+1;
                            }
                        }
                        //将第i个元素放在已经查找到的那个位置上
                        for(var j=i-1;j>=low;j--){
                             newArr[j+1]=newArr[j];//记录后移
                        }
                        newArr[low]=newArr[0];   //插入到正确的位置
                    }
              }
              //折半插入算法结束      
              //因为newArr的第0个元素为辅助排序的,为了输出美观,又对newArr数组进行了一次复制
              for(var i=1;i<newArr.length;i++){
                    resultArr[i-1]=newArr[i];
              }
              return resultArr;
           }
           var reArr=sortArr(arr);
           console.log('原来的数组'+arr.join(','));
           console.log('排序后的数组'+reArr.join(','));
    </script>

    冒泡排序

    <script>
          var arr=[33,12,3,2,1,0,67,98,6];  //待排序的数组
          console.log('原来的数组'+arr.join(','));
          function sortArr(curArr){
               //下面为冒泡排序的算法开始
               var flag=true;//用来标志是否要进行交换操作
               for(var i=0;i<curArr.length-1&&flag;i++){
                     flag=false;
                     for(var j=0;j<curArr.length-i;j++){
                          if(curArr[j]>curArr[j+1]){
                               //为逆序,则需要交换
                               var t=curArr[j+1];
                               curArr[j+1]=curArr[j];
                               curArr[j]=t;
                               flag=true;
                           }
                     }
               }
           //冒泡排序算法结束
    return curArr; } var reArr=sortArr(arr); console.log('排序后的数组'+reArr.join(',')); </script>

    简单选择排序

    <script>
         var arr=[33,12,3,5,2,0,67,98,6];  //待排序的数组
         console.log('原来的数组'+arr.join(','));
         function sortArr(curArr){
             //下面为简单选择排序的算法开始
             for(var i=0;i<curArr.length-1;i++){
                  var k=i;//假设当前项为最小的,记录其下标
                  for(var j=i+1;j<curArr.length;j++){
                       if(curArr[k]>curArr[j]){
                            //当逆序时需要交换
                            k=j;//更新最小项的下标
                       }
                  }
                  if(k!=i){
                      //意味着需要进行交换
                      var t=curArr[i];
                      curArr[i]=curArr[k];
                      curArr[k]=t;
                  }
               }
          //简单选择排序算法结束
    return curArr; } var reArr=sortArr(arr); console.log('排序后的数组'+reArr.join(',')); </script>
  • 相关阅读:
    node 使用 ssh2-sftp-client 实现 FTP 的文件上传和下载功能
    gulp 使用 gulp.spritesmith 组件生成雪碧图
    webpack4 打包多页面应用
    javascript 两个变量值的互换
    微信公众号爬坑(react)
    文件上传(H5 + node)
    前后端分离 ajax 跨域 session 传值 (后端使用 node)
    webpack dev 日记
    npm报错 端口被占用 events.js:167 throw er; // Unhandled 'error' event Error: listen EADDRINUSE 127.0.0.1:9999
    多个 img 之间存在间隔
  • 原文地址:https://www.cnblogs.com/mujinxinian/p/5708450.html
Copyright © 2011-2022 走看看