排序算法复习(Java实现):插入,冒泡,选择,Shell,快速排序, 归并排序,堆排序,桶式排序,基数排序

排序算法可视化:从冒泡到快排的原理与工程选型 排序算法是数据结构与算法学习中的核心内容,也是面试和工程实践的高频考点。理解不同排序算法的时间复杂度、空间复杂度和稳定性至关重要,但仅靠代码模板很难建立动态直觉。通过可视化演示,可以直观观察元素比较、交换与移动过程,深入理解冒泡排序、快速排序、归并排序等11种经典算法的工作原理。从O(n²)的冒泡、选择、插入排序,到O(n log n)的归并、快排、堆排序,再到计数排序、桶排序等非比较排序,每种算法都有其适用场景。实际工程中,应根据数据规模、有序性、内存限制和稳定性需求选择合适的排序策略,同时善用语言内置的 阅读详情

来自:http://www.blogjava.net/javacap/archive/2007/12/13/167364.html

 

 

为了便于管理,先引入个基础类:

package  algorithms;

/**
 *  @author  yovn
 *
  */
public   abstract   class  Sorter < E  extends  Comparable < E >>  {
    
     public   abstract   void  sort(E[] array, int  from , int  len);
    
     public   final   void  sort(E[] array)
    {
        sort(array, 0 ,array.length);
    }
     protected   final   void  swap(E[] array, int  from , int  to)
    {
        E tmp = array[from];
        array[from] = array[to];
        array[to] = tmp;
    }

}
一 插入排序
该算法在数据规模小的时候十分高效,该算法每次插入第K+1到前K个有序数组中一个合适位置,K从0开始到N-1,从而完成排序:
package  algorithms;
/**
 *  @author  yovn
  */
public   class  InsertSorter < E  extends  Comparable < E >>   extends  Sorter < E >  {

     /*  (non-Javadoc)
     * @see algorithms.Sorter#sort(E[], int, int)
      */
     public   void  sort(E[] array,  int  from,  int  len) {
         E tmp = null ;
           for ( int  i = from + 1 ;i < from + len;i ++ )
          {
              tmp = array[i];
               int  j = i;
               for (;j > from;j -- )
              {
                   if (tmp.compareTo(array[j - 1 ]) < 0 )
                  {
                      array[j] = array[j - 1 ];
                  }
                   else   break ;
              }
              array[j] = tmp;
          }
    }
        
    

}

二 冒泡排序
这可能是最简单的排序算法了,算法思想是每次从数组末端开始比较相邻两元素,把第i小的冒泡到数组的第i个位置。i从0一直到N-1从而完成排序。(当然也可以从数组开始端开始比较相邻两元素,把第i大的冒泡到数组的第N-i个位置。i从0一直到N-1从而完成排序。)

package  algorithms;

/**
 *  @author  yovn
 *
  */
public   class  BubbleSorter < E  extends  Comparable < E >>   extends  Sorter < E >  {

     private   static    boolean  DWON = true ;
    
     public   final   void  bubble_down(E[] array,  int  from,  int  len)
    {
         for ( int  i = from;i < from + len;i ++ )
        {
             for ( int  j = from + len - 1 ;j > i;j -- )
            {
                 if (array[j].compareTo(array[j - 1 ]) < 0 )
                {
                    swap(array,j - 1 ,j);
                }
            }
        }
    }
    
     public   final   void  bubble_up(E[] array,  int  from,  int  len)
    {
         for ( int  i = from + len - 1 ;i >= from;i -- )
        {
             for ( int  j = from;j < i;j ++ )
            {
                 if (array[j].compareTo(array[j + 1 ]) > 0 )
                {
                    swap(array,j,j + 1 );
                }
            }
        }
    }
    @Override
     public   void  sort(E[] array,  int  from,  int  len) {
        
         if (DWON)
        {
            bubble_down(array,from,len);
        }
         else
        {
            bubble_up(array,from,len);
        }
    }
    
}

三,选择排序
选择排序相对于冒泡来说,它不是每次发现逆序都交换,而是在找到全局第i小的时候记下该元素位置,最后跟第i个元素交换,从而保证数组最终的有序。
相对与插入排序来说,选择排序每次选出的都是全局第i小的,不会调整前i个元素了。
package  algorithms;
/**
 *  @author  yovn
 *
  */
public   class  SelectSorter < E  extends  Comparable < E >>   extends  Sorter < E >  {

     /*  (non-Javadoc)
     * @see algorithms.Sorter#sort(E[], int, int)
      */
    @Override
     public   void  sort(E[] array,  int  from,  int  len) {
         for ( int  i = 0 ;i < len;i ++ )
        {
             int  smallest = i;
             int  j = i + from;
             for (;j < from + len;j ++ )
            {
                 if (array[j].compareTo(array[smallest]) < 0 )
                {
                    smallest = j;
                }
            }
            swap(array,i,smallest);
                   
        }

    }
  
}
四 Shell排序
Shell排序可以理解为插入排序的变种,它充分利用了插入排序的两个特点:
1)当数据规模小的时候非常高效
2)当给定数据已经有序时的时间代价为O(N)
所以,Shell排序每次把数据分成若个小块,来使用插入排序,而且之后在这若个小块排好序的情况下把它们合成大一点的小块,继续使用插入排序,不停的合并小块,知道最后成一个块,并使用插入排序。

这里每次分成若干小块是通过“增量” 来控制的,开始时增量交大,接近N/2,从而使得分割出来接近N/2个小块,逐渐的减小“增量“最终到减小到1。

一直较好的增量序列是2^k-1,2^(k-1)-1,.....7,3,1,这样可使Shell排序时间复杂度达到O(N^1.5)
所以我在实现Shell排序的时候采用该增量序列
package  algorithms;

/**
 *  @author  yovn
  */
public   class  ShellSorter < E  extends  Comparable < E >>   extends  Sorter < E >   {

     /*  (non-Javadoc)
     * Our delta value choose 2^k-1,2^(k-1)-1,.7,3,1.
     * complexity is O(n^1.5)
     * @see algorithms.Sorter#sort(E[], int, int)
      */
    @Override
     public   void  sort(E[] array,  int  from,  int  len) {
        
         // 1.calculate  the first delta value;
         int  value = 1 ;
         while ((value + 1 ) * 2 < len)
        {
            value = (value + 1 ) * 2 - 1 ;
        
        }
    
         for ( int  delta = value;delta >= 1 ;delta = (delta + 1 ) / 2 - 1 )
        {
             for ( int  i = 0 ;i < delta;i ++ )
            {
                modify_insert_sort(array,from + i,len - i,delta);
            }
        }

    }
    
     private   final    void  modify_insert_sort(E[] array,  int  from,  int  len, int  delta) {
           if (len <= 1 ) return ;
          E tmp = null ;
           for ( int  i = from + delta;i < from + len;i += delta)
          {
              tmp = array[i];
               int  j = i;
               for (;j > from;j -= delta)
              {
                   if (tmp.compareTo(array[j - delta]) < 0 )
                  {
                      array[j] = array[j - delta];
                  }
                   else   break ;
              }
              array[j] = tmp;
          }

    }
}

五 快速排序
快速排序是目前使用可能最广泛的排序算法了。
一般分如下步骤:
1)选择一个枢纽元素(有很对选法,我的实现里采用去中间元素的简单方法)
2)使用该枢纽元素分割数组,使得比该元素小的元素在它的左边,比它大的在右边。并把枢纽元素放在合适的位置。
3)根据枢纽元素最后确定的位置,把数组分成三部分,左边的,右边的,枢纽元素自己,对左边的,右边的分别递归调用快速排序算法即可。
快速排序的核心在于分割算法,也可以说是最有技巧的部分。
package  algorithms;

/**
 *  @author  yovn
 *
  */
public   class  QuickSorter < E  extends  Comparable < E >>   extends  Sorter < E >  {

     /*  (non-Javadoc)
     * @see algorithms.Sorter#sort(E[], int, int)
      */
    @Override
     public   void  sort(E[] array,  int  from,  int  len) {
        q_sort(array,from,from + len - 1 );
    }

    
     private   final   void  q_sort(E[] array,  int  from,  int  to) {
         if (to - from < 1 ) return ;
         int  pivot = selectPivot(array,from,to);

        
        
        pivot = partion(array,from,to,pivot);
        
        q_sort(array,from,pivot - 1 );
        q_sort(array,pivot + 1 ,to);
        
    }


     private   int  partion(E[] array,  int  from,  int  to,  int  pivot) {
        E tmp = array[pivot];
        array[pivot] = array[to]; // now to's position is available
        
         while (from != to)
        {
             while (from < to && array[from].compareTo(tmp) <= 0 )from ++ ;
             if (from < to)
            {
                array[to] = array[from]; // now from's position is available
                to -- ;
            }
             while (from < to && array[to].compareTo(tmp) >= 0 )to -- ;
             if (from < to)
            {
                array[from] = array[to]; // now to's position is available now 
                from ++ ;
            }
        }
        array[from] = tmp;
         return  from;
    }


     private   int  selectPivot(E[] array,  int  from,  int  to) {
    
         return  (from + to) / 2 ;
    }

}
六 归并排序
算法思想是每次把待排序列分成两部分,分别对这两部分递归地用归并排序,完成后把这两个子部分合并成一个
序列。
归并排序借助一个全局性临时数组来方便对子序列的归并,该算法核心在于归并。
package  algorithms;

import  java.lang.reflect.Array;

/**
 *  @author  yovn
 *
  */
public   class  MergeSorter < E  extends  Comparable < E >>   extends  Sorter < E >   {

     /*  (non-Javadoc)
     * @see algorithms.Sorter#sort(E[], int, int)
      */
    @SuppressWarnings( " unchecked " )
    @Override
     public   void  sort(E[] array,  int  from,  int  len) {
         if (len <= 1 ) return ;
        E[] temporary = (E[])Array.newInstance(array[ 0 ].getClass(),len);
        merge_sort(array,from,from + len - 1 ,temporary);

    }

     private   final   void  merge_sort(E[] array,  int  from,  int  to, E[] temporary) {
         if (to <= from)
        {
             return ;
        }
         int  middle = (from + to) / 2 ;
        merge_sort(array,from,middle,temporary);
        merge_sort(array,middle + 1 ,to,temporary);
        merge(array,from,to,middle,temporary);
    }

     private   final   void  merge(E[] array,  int  from,  int  to,  int  middle, E[] temporary) {
         int  k = 0 ,leftIndex = 0 ,rightIndex = to - from;
        System.arraycopy(array, from, temporary,  0 , middle - from + 1 );
         for ( int  i = 0 ;i < to - middle;i ++ )
        {
            temporary[to - from - i] = array[middle + i + 1 ];
        }
         while (k < to - from + 1 )
        {
             if (temporary[leftIndex].compareTo(temporary[rightIndex]) < 0 )
            {
                array[k + from] = temporary[leftIndex ++ ];
                
            }
             else
            {
                array[k + from] = temporary[rightIndex -- ];
            }
            k ++ ;
        }
        
    }

}
七 堆排序
堆是一种完全二叉树,一般使用数组来实现。
堆主要有两种核心操作,
1)从指定节点向上调整(shiftUp)
2)从指定节点向下调整(shiftDown)
建堆,以及删除堆定节点使用shiftDwon,而在插入节点时一般结合两种操作一起使用。
堆排序借助最大值堆来实现,第i次从堆顶移除最大值放到数组的倒数第i个位置,然后shiftDown到倒数第i+1个位置,一共执行N此调整,即完成排序。
显然,堆排序也是一种选择性的排序,每次选择第i大的元素。
package  algorithms;

/**
 *  @author  yovn
 *
  */
public   class  HeapSorter < E  extends  Comparable < E >>   extends  Sorter < E >   {

     /*  (non-Javadoc)
     * @see algorithms.Sorter#sort(E[], int, int)
      */
    @Override
     public   void  sort(E[] array,  int  from,  int  len) {
        build_heap(array,from,len);

         for ( int  i = 0 ;i < len;i ++ )
        {
             // swap max value to the (len-i)-th position
            swap(array,from,from + len - 1 - i);
            shift_down(array,from,len - 1 - i, 0 ); // always shiftDown from 0
        }
    }

     private  final   void  build_heap(E[] array,  int  from,  int  len) {
         int  pos = (len - 1 ) / 2 ; // we start from (len-1)/2, because branch's node +1=leaf's node, and all leaf node is already a heap
         for ( int  i = pos;i >= 0 ;i -- )
        {
            shift_down(array,from,len,i);
        }
        
    }
    
     private   final   void  shift_down(E[] array, int  from,  int  len,  int  pos)
    {
        
        E tmp = array[from + pos];
         int  index = pos * 2 + 1 ; // use left child
         while (index < len) // until no child
        {
             if (index + 1 < len && array[from + index].compareTo(array[from + index + 1 ]) < 0 ) // right child is bigger
            {
                index += 1 ; // switch to right child
            }
             if (tmp.compareTo(array[from + index]) < 0 )
            {
                array[from + pos] = array[from + index];
                pos = index;
                index = pos * 2 + 1 ;
                
            }
             else
            {
                 break ;
            }
            
        }
        array[from + pos] = tmp;
            
    }

    
}

八 桶式排序
桶式排序不再是基于比较的了,它和基数排序同属于分配类的排序,这类排序的特点是事先要知道待排序列的一些特征。
桶式排序事先要知道待排序列在一个范围内,而且这个范围应该不是很大的。
比如知道待排序列在[0,M)内,那么可以分配M个桶,第I个桶记录I的出现情况,最后根据每个桶收到的位置信息把数据输出成有序的形式。
这里我们用两个临时性数组,一个用于记录位置信息,一个用于方便输出数据成有序方式,另外我们假设数据落在0到MAX,如果所给数据不是从0开始,你可以把每个数减去最小的数。
package  algorithms;

/**
 *  @author  yovn
 *
  */
public   class  BucketSorter {

    
    
     public   void  sort( int [] keys, int  from, int  len, int  max)
    {
         int [] temp = new   int [len];
         int [] count = new   int [max];
        
        
         for ( int  i = 0 ;i < len;i ++ )
        {
            count[keys[from + i]] ++ ;
        }
         // calculate position info
         for ( int  i = 1 ;i < max;i ++ )
        {
            count[i] = count[i] + count[i - 1 ]; // this means how many number which is less or equals than i,thus it is also position + 1 
        }
        
        System.arraycopy(keys, from, temp,  0 , len);
         for ( int  k = len - 1 ;k >= 0 ;k -- ) //from the ending to beginning can keep the stability
        {
            keys[ -- count[temp[k]]] = temp[k]; //  position +1 =count
        }
    }
     /**
     *  @param  args
      */
     public   static   void  main(String[] args) {

         int [] a = { 1 , 4 , 8 , 3 , 2 , 9 , 5 , 0 , 7 , 6 , 9 , 10 , 9 , 13 , 14 , 15 , 11 , 12 , 17 , 16 };
        BucketSorter sorter = new  BucketSorter();
        sorter.sort(a, 0 ,a.length, 20 ); // actually is 18, but 20 will also work
        
        
         for ( int  i = 0 ;i < a.length;i ++ )
        {
            System.out.print(a[i] + " , " );
        }

    }

}

九 基数排序
基数排序可以说是扩展了的桶式排序,比如当待排序列在一个很大的范围内,比如0到999999内,那么用桶式排序是很浪费空间的。而基数排序把每个排序码拆成由d个排序码,比如任何一个6位数(不满六位前面补0)拆成6个排序码,分别是个位的,十位的,百位的。。。。
排序时,分6次完成,每次按第i个排序码来排。
一般有两种方式:
1) 高位优先(MSD): 从高位到低位依次对序列排序
2)低位优先(LSD): 从低位到高位依次对序列排序
计算机一般采用低位优先法(人类一般使用高位优先),但是采用低位优先时要确保排序算法的稳定性。
基数排序借助桶式排序,每次按第N位排序时,采用桶式排序。对于如何安排每次落入同一个桶中的数据有两种安排方法:
1)顺序存储:每次使用桶式排序,放入r个桶中,,相同时增加计数。
2)链式存储:每个桶通过一个静态队列来跟踪。

package  algorithms;

import  java.util.Arrays;


/**
 *  @author  yovn
 *
  */
public   class  RadixSorter {
    
     public   static   boolean  USE_LINK = true ;
    
     /**
     * 
     *  @param  keys
     *  @param  from
     *  @param  len
     *  @param  radix  key's radix
     *  @param  d      how many sub keys should one key divide to
      */
     public   void  sort( int [] keys, int  from , int  len, int  radix,  int  d)
    {
         if (USE_LINK)
        {
            link_radix_sort(keys,from,len,radix,d);
        }
         else
        {
            array_radix_sort(keys,from,len,radix,d);
        }
        
    }
    
    
     private   final   void  array_radix_sort( int [] keys,  int  from,  int  len,  int  radix,
             int  d) 
    {
         int [] temporary = new   int [len];
         int [] count = new   int [radix];
         int  R = 1 ;
        
         for ( int  i = 0 ;i < d;i ++ )
        {
            System.arraycopy(keys, from, temporary,  0 , len);
            Arrays.fill(count,  0 );
             for ( int  k = 0 ;k < len;k ++ )
            {
                 int  subkey = (temporary[k] / R) % radix;
                count[subkey] ++ ;
            }
             for ( int  j = 1 ;j < radix;j ++ )
            {
                count[j] = count[j] + count[j - 1 ];
            }
             for ( int  m = len - 1 ;m >= 0 ;m -- )
            {
                 int  subkey = (temporary[m] / R) % radix;
                 -- count[subkey];
                keys[from + count[subkey]] = temporary[m];
            }
            R *= radix;
        }
           
    }


     private   static   class  LinkQueue
    {
         int  head =- 1 ;
         int  tail =- 1 ;
    }
     private   final   void  link_radix_sort( int [] keys,  int  from,  int  len,  int  radix,  int  d) {
        
         int [] nexts = new   int [len];
        
        LinkQueue[] queues = new  LinkQueue[radix];
         for ( int  i = 0 ;i < radix;i ++ )
        {
            queues[i] = new  LinkQueue();
        }
         for ( int  i = 0 ;i < len - 1 ;i ++ )
        {
            nexts[i] = i + 1 ;
        }
        nexts[len - 1 ] =- 1 ;
        
         int  first = 0 ;
         for ( int  i = 0 ;i < d;i ++ )
        {
            link_radix_sort_distribute(keys,from,len,radix,i,nexts,queues,first);
            first = link_radix_sort_collect(keys,from,len,radix,i,nexts,queues);
        }
         int [] tmps = new   int [len];
         int  k = 0 ;
         while (first !=- 1 )
        {
        
            tmps[k ++ ] = keys[from + first];
            first = nexts[first];
        }
        System.arraycopy(tmps,  0 , keys, from, len);
        
        
    }
     private   final   void  link_radix_sort_distribute( int [] keys,  int  from,  int  len,
             int  radix,  int  d,  int [] nexts, LinkQueue[] queues, int  first) {
        
         for ( int  i = 0 ;i < radix;i ++ )queues[i].head = queues[i].tail =- 1 ;
         while (first !=- 1 )
        {
             int  val = keys[from + first];
             for ( int  j = 0 ;j < d;j ++ )val /= radix;
            val = val % radix;
             if (queues[val].head ==- 1 )
            {
                queues[val].head = first;
            }
             else  
            {
                nexts[queues[val].tail] = first;
                
            }
            queues[val].tail = first;
            first = nexts[first];
        }
        
    }
     private   int  link_radix_sort_collect( int [] keys,  int  from,  int  len,
             int  radix,  int  d,  int [] nexts, LinkQueue[] queues) {
         int  first = 0 ;
         int  last = 0 ;
         int  fromQueue = 0 ;
         for (;(fromQueue < radix - 1 ) && (queues[fromQueue].head ==- 1 );fromQueue ++ );
        first = queues[fromQueue].head;
        last = queues[fromQueue].tail;
        
         while (fromQueue < radix - 1 && queues[fromQueue].head !=- 1 )
        {
            fromQueue += 1 ;
             for (;(fromQueue < radix - 1 ) && (queues[fromQueue].head ==- 1 );fromQueue ++ );
            
            nexts[last] = queues[fromQueue].head;
            last = queues[fromQueue].tail;
            
        }
         if (last !=- 1 )nexts[last] =- 1 ;
         return  first;
    }
    
     /**
     *  @param  args
      */
     public   static   void  main(String[] args) {
         int [] a = { 1 , 4 , 8 , 3 , 2 , 9 , 5 , 0 , 7 , 6 , 9 , 10 , 9 , 135 , 14 , 15 , 11 , 222222222 , 1111111111 , 12 , 17 , 45 , 16 };
        USE_LINK = true ;
        RadixSorter sorter = new  RadixSorter();
        sorter.sort(a, 0 ,a.length, 10 , 10 );
         for ( int  i = 0 ;i < a.length;i ++ )
        {
            System.out.print(a[i] + " , " );
        }


    }

}

网络攻防实验——网络监听 利用CAIN实现ARP监听。 阅读详情

相关推荐

【文本分析学习】Anaconda+pytorch虚拟环境下的pycharm文本分析(含分词、词性标注、词形归一化、停用词、文本情感分析、词频、文本相似度,附数据代码) NLTK

文本分析学习之 Anadconda+pytorch虚拟环境下的pycharm文本分析(含分词、词性标注、词形归一化、停用词、文本情感分析、词频、文本相似度,附数据代码)

littlexmj的博客 2330

常用十大排序算法

列举了常见的十大内部排序算法:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序,计数排序,桶排序。

qq_51664685的博客 15万+

深入解析UDS 0x19服务:DTC状态掩码与故障诊断实战

本文深入解析了UDS诊断协议中的核心0x19服务(ReadDTCInformation),重点拆解了DTC状态掩码(DTCStatusMask)的八个状态位及其在故障生命周期中的联动逻辑。通过实战案例,详细说明了从故障发生、确认到清除的全过程,并介绍了如何利用该服务进行深度诊断,包括读取扩展数据(如冻结帧)和避免常见开发误区,是理解汽车ECU故障管理机制的关键。

weixin_29248313的博客 323

Java语言常用的算法

分治算法是一种递归的算法思想,其基本思想是将一个大问题分解为若干个小问题,分别解决这些小问题,最后将小问题的解合并起来得到大问题的解。二分查找,也称为折半查找,它要求数据集合必须是有序的,它的基本思想是将数据集合分成两半,如果目标元素比中间元素小,就在前半部分继续查找,否则在后半部分继续查找,直到找到目标元素或数据集合为空。在实际应用中,分治算法也可以用来解决很多实际问题,比如在计算机图形学中,将一个大的图形对象分解成若干个小的三角形对象,每个小对象单独处理后再合并成一个大对象。

qq_45506362的博客 1万+

【AI知识点】启发式算法(Heuristic Algorithms)

启发式算法(Heuristic Algorithms) 是一种基于经验、直觉和局部优化的求解问题的算法,尤其适用于解决计算复杂度高、规模庞大的问题。它们通过简化问题、局部搜索和快速近似,提供了一种在短时间内获得“足够好”解的途径。虽然启发式算法无法保证全局最优解,但它们在实际应用中广泛使用,特别是在优化问题、任务调度和机器学习等领域。

AI完全体 3031

国产麒麟系统下Kettle安装避坑指南:解决aarch64架构不支持问题

本文详细解析了在国产麒麟系统上部署Kettle时遇到的aarch64架构不支持问题,提供了从获取适配的SWT库、修改启动脚本到生产环境调优的完整解决方案。文章重点解决了ARM架构与Java GUI工具的兼容性挑战,并分享了内存配置、字体显示及Carte服务部署等实战经验,助力用户在国产化环境中稳定运行ETL流程。

weixin_29197835的博客 559

详解Java常用排序算法(10种,含演示动画)

Java常用的排序算法有以下几种: 1. 冒泡排序;2. 选择排序;3. 插入排序;4. 希尔排序;5. 归并排序;6. 快速排序;7. 堆排序;8. 计数排序;9. 桶排序;10. 基数排序。 这些排序算法都有各自的优缺点,应根据具体情况选择适合的算法。

不积跬步无以至千里,不积小流无以成江海。一个喜欢学习分享的程序员 3万+

Linux内存压力测试工具【memtester】详且精

对Linux下的压力测试工具memtester有一个比较人性化的概述,以及避坑心得。

weixin_44118923的博客 1万+

java算法大全

Java算法大全包含了许多用于解决特定问题的算法,这些算法可以在Java程序中使用。 常见的Java算法包括排序算法(如快速排序、归并排序和堆排序)、搜索算法(如二分搜索和A*搜索)、图论算法(如最短路径算法和最小生成树算法)以及数据结构(如哈希表、二叉搜索树和图)。 这些算法可以用来解决各种各样的问题,如排序大型数据集、寻找最短路径、求解最小生成树等。使用正确的算法可以帮助你提高程序的效率,并解...

weixin_35754962的博客 2062

华为HCIA-Datacom实战:200人企业园区网从规划到部署全流程解析

本文详细解析了华为HCIA-Datacom认证实战中200人企业园区网的规划与部署全流程。从需求分析、组网架构设计到设备选型、VLAN划分及安全策略实施,全面覆盖园区网建设的关键环节,特别针对部门隔离、无线覆盖和基础安全防护等典型场景提供可落地的解决方案。

f0g1h2的博客 710

别再为数据发愁:5分钟理解事件相机原理,并自己动手生成事件图像

本文深入浅出地解析了事件相机的工作原理,并提供了从静态图像生成事件数据的实用方法。通过Python代码示例,读者可以快速掌握如何模拟事件相机的输出,应用于机器人导航、自动驾驶等领域,解决数据获取难题。

weixin_31458015的博客 298

常见十四种的Java算法

一、简单列出常见的Java中14种算法 序号 简称 英文名称 简介 1 二分查找 Binary Search 二分查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。 2 冒泡排序 Bubble Sort 3 插入排序 4 快速排序 5 希尔排序 6 归并排序 7 桶排序 8 基数排序

心有谦谦结 4万+

045、镜头模组公差链分析:从 Lens 到 Sensor 的装配公差累积与良率优化

本文深入分析了镜头模组从镜片到传感器各环节的公差累积问题及优化策略。文章首先剖析了四级公差链(镜片单体、镜筒装配、VCM定位、传感器贴装)的误差传递机制,指出各环节典型公差值及其影响(如5微米镜片偏差可导致0.02度光线偏折)。其次对比了最坏情况法与均方根法的差异,强调需考虑公差相关性(如镜片曲率与镜筒间隙的正相关性)。最后提出良率优化"三板斧":通过蒙特卡洛仿真优化公差分配、采用主动对准工艺在线补偿、建立数据反馈闭环系统,并结合"阴阳脸"案例说明如何定位根因(模具磨损+贴片机老化导致的误差叠加)。作者总结

sundong_81的博客 59

排序算法复习(Java实现):插入,冒泡,选择,Shell,快速排序, 归并排序,堆排序,桶式排序,基数排序 ...

来自:http://www.blogjava.net/javacap/archive/2007/12/13/167364.html 为了便于管理,先引入个基础类: package algorithms; /** * @author yovn * */ public abstract class Sorter&lt;E extends Comparable&lt;E&gt;&...

128

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

java基础复习笔记 数据结构_Java基础复习笔记基本排序算法

Java基础复习笔记基本排序算法1.排序排序是一个历来都是很多算法家热衷的领域,到现在还有很多数学家兼计算机专家还在研究。而排序是计算机程序开发中常用的一种操作。为何需要排序呢。我们在所有的系统中几乎都要检索数据,而这些欲检索的数据如果有规律的话,比如按照某些字段、属性降序排序的话,那么从这些有规律的数据查询结果或者结果集的话就快速得多。2.常用算法常用的算法有:直接选择排序、堆排序、冒泡排序、快...

weixin_26905487的博客 183

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

排序算法复习(Java实现)

为了便于管理,先引入个基础类:Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->package algorithms;/** * @author yovn * */public abstract class SorterE ext

技术并艺术着 1452

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

排序算法复习(Java实现)(三): 插入,冒泡,选择,Shell,快速排序

六 归并排序 算法思想是每次把待排序列分成两部分,分别对这两部分递归地用归并排序,完成后把这两个子部分合并成一个 序列。 归并排序借助一个全局性临时数组来方便对子序列的归并,该算法核心在于归并。 package algorithms; import java.lang.reflect.Array; /** * @author yovn * */ public ...

nba520pz的专栏 117

Java基础复习笔记11基本排序算法

1.       排序 排序是一个历来都是很多算法家热衷的领域,到现在还有很多数学家兼计算机专家还在研究。而排序是计算机程序开发中常用的一种操作。为何需要排序呢。我们在所有的系统中几乎都要检索数据,而这些欲检索的数据如果有规律的话,比如按照某些字段、属性降序排序的话,那么从这些有规律的数据查询结果或者结果集的话就快速得多。 2.       常用算法 常用的算法有:直接选择排序、堆排序、冒泡

aiqing0119的专栏 1004

java 常见排序算法

摘自http://deng5566.iteye.com/blog/678817,仅供自学。       排序算法复习(Java实现)(一): 插入,冒泡,选择,Shell,快速排序  为了便于管理,先引入个基础类: package algorithms;   /**  * @author yovn  *  */ public abstract class Sorter...

点点滴滴 92

Java复习(二)——算法与数据结构

算法与数据结构

初叙 286

Java-面试复习-整理03

目录一些算法排序算法分治动态规划 一些算法 排序算法 1.冒泡:1.时间复杂度:平均O(n2),最好O(n),最坏O(n2)    空间复杂度:O(1)    稳定(没有发生跳跃式的交换:排序前后相同数字的前后顺序没有改变)    每次将最大的数放到后面 public static int[] bubbleSort(int[] arr) { if(arr == null || arr.length <= 1){ return arr; }

冼穆的博客 174

数据结构排序算法总结

数据结构排序算法特别多,由于时间有限,随着复习深度的推进和算法的重要性,这里进行适当的归纳总结,在往后的时间里我会逐步完善和细化。算法皆由本人用Java独立编程实现,转载请注明出处,同时欢迎大神拍砖。 1.冒泡排序 1 package test; 2 /** 3 * 冒泡排序 4 * @author xuanxufeng 5 * 6 */ 7 publ...

weixin_30488085的博客 79

java算法

[code="java"]排序算法复习(Java实现)(一): 插入,冒泡,选择,Shell,快速排序 为了便于管理,先引入个基础类: package algorithms; /** * @author yovn * */ public abstract class Sorter { public abstract void sort(E[] arr...

iteye_7219的博客 146
上一篇: Java泛型编程快速入门
下一篇: 灵肉分离与虚拟克隆(一)
wave2007
博客等级 码龄19年 2粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值