本文中只涉及各种排序,查找算法的核心代码片段:
/*
* 顺序查找:从数组的第一个元素开始依次查找
*/
public static int getIndex(int[] is,int i){
int len = is.length;
for(int j=0;j<len;j++){
if(is[j]==i){
return j;
}
}
return -1;
}
/**
*
* 功能:插入排序算法
*/
public static void insertSort(int[] is) {
// 获取数组的长度
int len = is.length;
// 外层循环负责提供当前的值
for (int i = 1; i < len; i++) {
// 内循环负责使用当前的值与已经排序的元素进行比较定位,从后向前
for (int j = i; j > 0; j--) {
// 当前需要排序的数字和已经排序的数组中最大的还小,逐一交换
if (is[j] < is[j - 1]) {
int temp = is[j];
is[j] = is[j - 1];
is[j - 1] = temp;
} else {// 如果相等或者还要大,则当前位置刚合适,无需交换
break;
}
}
}
}
/*
* 二分查找法:
* 前提:已经排序的数组
* 基本思路:
* 1 首先确定该查找区间的中间点位置: int mid = (low+upper) / 2;
* 2 然后将待查找的值与中间点位置的值比较:
* 1)若相等,则查找成功并返回此位置。
* 2)若中间点位置值大于待查值,则新的查找区间是中间点位置的左边区域,即结束位置左移到中间点位置-1
* 3)若中间点位置值小于待查值,则新的查找区间是中间点位置的右边区域,即开始位置左移到中间点位置+1
* 4)下一次查找是针对新的查找区间进行的。
*/
public static int lookForTwo(int [] is,int k){
int len = is.length;
//开始位置
int begin = 0;
//结束位置
int end = len-1;
while(begin<=end){//开始位置小于等于结束位置时,循环需要持续进行
//获取中间位置
int mid = (begin+end)/2;
if(is[mid]==k){//中间位置的值和待查找值相等则直接返回mid值
return mid;
}
else if(is[mid]<k){//中点索引处的值比查找值小,则在右侧查找。所以开始位置需要右移
begin = mid+1;
}
else{//中点索引处的值比查找值大,则在左侧查找,所以结束位置需要左移
end = mid - 1;
}
}
return -1;//指定数组不包含指定值的话默认返回-1;
}
/*
* 功能: Arrays工具类的使用
*/
public static void main(String[] args) {
double[] ds = {2.8,9.9,1.5,2.6,3.7,4.8,10.0};
//从小到大排序
Arrays.sort(ds);
for(double a:ds){
System.out.print(a+" ");
}
//二分法查找
int index = Arrays.binarySearch(ds,9.9);
System.out.println(index);
}
/*
* label标记的使用(类似其他语言的goto)。
* 备注:标号label必需放在循环之前(意味着循环必需紧跟着标号),即Label和下面的循环语句间不能有其他代码
* 1 嵌套循环时,一次跳出所有循环的方式:break+标号
* 2 continue outer语句,它告诉计算机退出现在的循环并继续执行outer循环
*/
public class TestLabel {
public static void main(String[] args) {
info:for(int i=1;i<=10;i++){
System.out.println("外循环变量i="+i);
for(int j=1;j<=10;j++){
if(j==5){//当j=5时候,终止内循环
continue info;
}
System.out.println(i+"*"+j+"="+i*j);
}
}
}
}
/*
* 功能:使用二维数组实现诗词的横向和纵向打印效果
*/
public class TestPoem {
public static void main(String[] args) {
String[][] ss = {{"春","眠","不","觉","晓"},{"处","处","蚊","子","咬"}};
System.out.println("****横向打印****");
for(String[] is:ss){
for(String s:is){
System.out.print(s);
}
System.out.println();
}
System.out.println("****纵向打印****");
int len = ss[0].length;
for(int i = 0;i<len;i++){
System.out.println(ss[1][i]+" "+ss[0][i]);
}
}
}
/*
* 二维数组:java没有多维数组的概念,二维数组实际是一个一维数组,他的元素是由一维数组组成的。
* 使用方式:
* 1 静态初始化:变量声明 分配空间 赋值一步完成。
* 数据类型[][] 二维数组名 = {{},...};//new 数据类型[][] {{},...};
* 2 动态初始化:
* 1)变量声明:数据类型[][] 二维数组名;
* 2)空间分配:二维数组名 = new 数据类型[二维数组的大小][];// new 数据类型[二维数组的大小][一维数组大小];
* 3)如果步骤2中一维数组大小不定,需要在此进行一维数组空间分配。
* 4)赋值:二维数组名[二维数组的索引] [一维数组索引] = 值;
*
* 取值方式:二维数组名[二维数组的索引] [一维数组索引]
*/
public class TestTwoArray {
public static void main(String[] args) {
String [] row1 = {"aaa","bbb"};
String[] row2 = {"ccc","ddd"};
String[] row3 = {"ee"};
String [] [] names = {row1,row2,row3};
int len = names.length;
for(int i=0;i<len;i++){
//二维数组每次循环得到一个一维数组
String[] temp = names[i];
int le = temp.length;//一维数组的长度
System.out.print("第"+(i+1)+"排: ");
for(int j=0;j<le;j++){
System.out.print(temp[j]+" ");//names[i][j]
}
System.out.println();
}
System.out.println("=================");
//forEach:
for(String [] ss :names){
for(String s:ss){
System.out.println(s);
}
}
}
}
/*
* 功能:二维数组的动态初始化
*/
public class TestTwoArray2 {
public static void main(String[] args) {
//二维数组声明
int[][] is;
//分配空间:二维数组中一维数组容量不相等则填写第二个[]数字
is = new int[3][];
//一维数组初始化
is[0] = new int[2];
is[1] = new int[3];
is[2] = new int[4];
is[0][0] = 1;
is[0][1] = 2;
is[1][0] = 11;
is[1][1] = 12;
is[1][2] = 13;
is[2][0] = 111;
is[2][1] = 112;
for (int[] ii : is) {
System.out.println("======");
for (int i : ii) {
System.out.print(i + " ");
}
System.out.println();
}
}
}