数组中元素的排序,查找

来源:互联网 发布:淘宝买卖交易平台 编辑:程序博客网 时间:2024/06/05 16:01

本文中只涉及各种排序,查找算法的核心代码片段:

/*
     * 顺序查找:从数组的第一个元素开始依次查找
     */
    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();
        }
    }

}

1 0
原创粉丝点击