Java经典算法

简介:
1、冒泡排序 Bubble Sort
最简单的排序方法是冒泡排序方法。这种方法的基本思想是,将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮。在冒泡排序算法中我们要对这个“气泡”序列处理若干遍。所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确。如果发现两个相邻元素的顺序不对,即“轻”的元素在下面,就交换它们的位置。显然,处理一遍之后,“最轻”的元素就浮到了最高位置;处理二遍之后,“次轻”的元素就浮到了次高位置。在作第二遍处理时,由于最高位置上的元素已是“最轻”元素,所以不必检查。一般地,第i遍处理时,不必检查第i高位置以上的元素,因为经过前面i-1遍的处理,它们已正确地排好序。这个算法可实现如下。
算法如下:
/** 
         *冒泡排序 
         *@paramsrc待排序数组 
         */
 
         void doBubbleSort( int[] src) 
        { 
              int len=src.length; 
              for( int i=0;i<len;i++) 
             { 
                      for( int j=i+1;j<len;j++) 
                     { 
                             int temp; 
                             if(src[i]>src[j]) 
                            { 
                                    temp=src[j]; 
                                    src[j]=src[i]; 
                                    src[i]=temp; 
                            }                            
                     } 
                     printResult(i,src); 
             }             
        }
 2、选择排序 Selection Sort
选择排序的基本思想是:对待排序的记录序列进行n-1遍的处理,第1遍处理是将L[1..n]中最小者与L[1]交换位置,第2遍处理是将L[2..n]中最小者与L[2]交换位置,......,第i遍处理是将L[i..n]中最小者与L[i]交换位置。这样,经过i遍处理之后,前i个记录的位置就已经按从小到大的顺序排列好了。
当然,实际操作时,也可以根据需要,通过从待排序的记录中选择最大者与其首记录交换位置,按从大到小的顺序进行排序处理。
算法如下:
/** 
         *选择排序 
         *@paramsrc待排序的数组 
         */
 
         void doChooseSort( int[] src) 
        { 
              int len=src.length; 
              int temp; 
              for( int i=0;i<len;i++) 
             { 
                     temp=src[i]; 
                      int j; 
                      int samllestLocation=i; //最小数的下标 
                      for(j=i+1;j<len;j++) 
                     { 
                             if(src[j]<temp) 
                            { 
                                    temp=src[j]; //取出最小值 
                                    samllestLocation=j; //取出最小值所在下标 
                            } 
                     } 
                     src[samllestLocation]=src[i]; 
                     src[i]=temp; 
                     printResult(i,src); 
             } 
        }
3、插入排序 Insertion Sort
插入排序的基本思想是,经过i-1遍处理后,L[1..i-1]己排好序。第i遍处理仅将L[i]插入L[1..i-1]的适当位置,使得L[1..i]又是排好序的序列。要达到这个目的,我们可以用顺序比较的方法。首先比较L[i]和L[i-1],如果L[i-1]≤ L[i]騆[1..i]已排好序,第i遍处理就结束了;否则交换L[i]与L[i-1]的位置,继续比较L[i-1]和L[i-2],直到找到某一个位置j(1≤j≤i-1),使得L[j] ≤L[j+1]时为止。
简言之,插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。插入排序方法分直接插入排序和折半插入排序两种,这里只介绍直接插入排序,折半插入排序留到“查找”内容中进行。
图1演示了对4个元素进行直接插入排序的过程,共需要(a),(b),(c)三次插入。
图1 对4个元素进行插入排序
在下面的插入排序算法中,为了写程序方便我们可以引入一个哨兵元素L[0],它小于L[1..n]中任一记录。所以,我们设元素的类型ElementType中有一个常量-∞,它比可能出现的任何记录都小。如果常量-∞不好事先确定,就必须在决定L[i]是否向前移动之前检查当前位置是否为1,若当前位置已经为1时就应结束第i遍的处理。另一个办法是在第i遍处理开始时,就将L[i]放入L[0]中,这样也可以保证在适当的时候结束第i遍处理。下面的算法中将对当前位置进行判断。
算法如下:
/**    
                 *插入排序(WHILE循环实现)    
                 *@paramsrc待排序数组    
                 */
    
                 void doInsertSort1( int[] src)    
                {    
                          int len=src.length;    
                          for( int i=1;i<len;i++)    
                         {                 
                                          int temp=src[i];    
                                          int j=i;    
                                                 
                                          while(src[j-1]>temp)    
                                         {    
                                                        src[j]=src[j-1];    
                                                        j--;    
                                                         if(j<=0)    
                                                                         break;    
                                         }    
                                         src[j]=temp;    
                                         printResult(i+1,src);    
                         }    
                }    
                 /**    
                 *插入排序(FOR循环实现)    
                 *@paramsrc待排序数组    
                 */
    
                 void doInsertSort2( int[] src)    
                {    
                          int len=src.length;    
                          for( int i=1;i<len;i++)    
                         {    
                                          int j;    
                                          int temp=src[i];    
                                          for(j=i;j>0;j--)    
                                         {    
                                                         if(src[j-1]>temp)    
                                                        {    
                                                                        src[j]=src[j-1];    
                                                                            
                                                        } else //如果当前的数,不小前面的数,那就说明不小于前面所有的数,    
                                                                          //因为前面已经是排好了序的,所以直接通出当前一轮的比较    
                                                                         break;    
                                         }    
                                         src[j]=temp;    
                                         printResult(i,src);    
                         }    
                }
   


本文转自sucre03 51CTO博客,原文链接:http://blog.51cto.com/sucre/353611,如需转载请自行联系原作者
相关文章
|
1月前
|
算法 搜索推荐 Java
数据结构与算法(Java篇)笔记--希尔排序
数据结构与算法(Java篇)笔记--希尔排序
|
1月前
|
算法 Java
[Java·算法·简单] LeetCode 27. 移除元素 详细解读
[Java·算法·简单] LeetCode 27. 移除元素 详细解读
23 1
|
1月前
|
算法 Java
[Java·算法·简单] LeetCode 13. 罗马数字转整数 详细解读
[Java·算法·简单] LeetCode 13. 罗马数字转整数 详细解读
23 0
|
30天前
|
存储 算法 Java
Java数据结构与算法-java数据结构与算法(二)
Java数据结构与算法-java数据结构与算法
89 1
|
1月前
|
算法 Java
[Java·算法·中等] LeetCode15. 三数之和
[Java·算法·中等] LeetCode15. 三数之和
30 0
|
2天前
|
设计模式 算法 Java
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
|
17天前
|
算法 安全 Java
java代码 实现AES_CMAC 算法测试
该代码实现了一个AES-CMAC算法的简单测试,使用Bouncy Castle作为安全提供者。静态变量K定义了固定密钥。`Aes_Cmac`函数接受密钥和消息,返回AES-CMAC生成的MAC值。在`main`方法中,程序对给定的消息进行AES-CMAC加密,然后模拟接收ECU的加密结果并进行比较。如果两者匹配,输出&quot;验证成功&quot;,否则输出&quot;验证失败&quot;。辅助方法包括将字节转为16进制字符串和将16进制字符串转为字节。
|
24天前
|
搜索推荐 Java
Java排序算法
Java排序算法
18 0
|
24天前
|
搜索推荐 Java
Java基础(快速排序算法)
Java基础(快速排序算法)
24 4
|
27天前
|
存储 算法 JavaScript
Java入门高频考查算法逻辑基础知识3-编程篇(超详细18题1.8万字参考编程实现)
解决这类问题时,建议采取下面的步骤: 理解数学原理:确保你懂得基本的数学公式和法则,这对于制定解决方案至关重要。 优化算法:了解时间复杂度和空间复杂度,并寻找优化的机会。特别注意避免不必要的重复计算。 代码实践:多编写实践代码,并确保你的代码是高效、清晰且稳健的。 错误检查和测试:要为你的代码编写测试案例,测试标准的、边缘情况以及异常输入。 进行复杂问题简化:面对复杂的问题时,先尝试简化问题,然后逐步分析和解决。 沟通和解释:在编写代码的时候清晰地沟通你的思路,不仅要写出正确的代码,还要能向面试官解释你的
33 0