zoukankan      html  css  js  c++  java
  • 《java入门第一季》之Arrays类前传(排序案例以二分查找注意的问题)

    根据排序算法,可以解决一些小案例。举例如下:

    /*
     * 把字符串中的字符进行排序。
     * 		举例:"dacgebf"
     * 		结果:"abcdefg"
     * 
     * 分析:
     * 		A:定义一个字符串
     * 		B:把字符串转换为字符数组
     * 		C:把字符数组进行排序
     * 		D:把排序后的字符数组转成字符串
     * 		E:输出最后的字符串
     */
    public class ArrayTest {
    	public static void main(String[] args) {
    		// 定义一个字符串
    		String s = "dacgebf";
    
    		// 把字符串转换为字符数组
    		char[] chs = s.toCharArray();// 将此字符串转换为一个新的字符数组。String类的方法public char[] toCharArray()
    
    		// 把字符数组进行排序
    		bubbleSort(chs);//自定义排序方法。这里定义为冒泡算法
    
    		// 把排序后的字符数组转成字符串,valueOf()把任意类型转换为字符串。
    		String result = String.valueOf(chs);// String类的方法:public static String valueOf(char[] data)返回:一个新分配的字符串
    									
    
    		// 输出最后的字符串
    		System.out.println("result:" + result);
    	}
    
    	// 冒泡排序
    	public static void bubbleSort(char[] chs) {// 冒泡方法,最大索引的值不用再去比较了
    		for (int x = 0; x < chs.length - 1; x++) {
    			for (int y = 0; y < chs.length - 1 - x; y++) {
    				if (chs[y] > chs[y + 1]) {// 前面的大于后面的,交换,始终使后面的大于前面。
    					char temp = chs[y];// 交换
    					chs[y] = chs[y + 1];
    					chs[y + 1] = temp;
    				}
    			}
    		}
    	}
    }

    二分查找存在一的一个注意事项。

    二分查找仅仅在有序的数组中进行查找。如果给定的是无序的,不可以使用二分查找。下面就举例说明,问题出在哪里。


    public class ArrayDemo2 {
    	public static void main(String[] args) {
    		// 定义数组
    		int[] arr = { 24, 69, 80, 57, 13 };
    
    		// 先排序
    		bubbleSort(arr);
    		// 后查找
    		int index = getIndex(arr, 80);
    		System.out.println("index:" + index);
    	}
    
    	// 冒泡排序代码
    	public static void bubbleSort(int[] arr) {
    		for (int x = 0; x < arr.length - 1; x++) {// 次数,几轮
    			for (int y = 0; y < arr.length - 1 - x; y++) {//
    				if (arr[y] > arr[y + 1]) {// 两两比较,把小的数放到前面去,把大的最终放在最后
    					int temp = arr[y];
    					arr[y] = arr[y + 1];
    					arr[y + 1] = temp;
    				}
    			}
    		}
    	}
    
    	// 二分查找
    	public static int getIndex(int[] arr, int value) {
    		// 定义最大索引,最小索引
    		int max = arr.length - 1;
    		int min = 0;
    
    		// 计算出中间索引
    		int mid = (max + min) / 2;
    
    		// 拿中间索引的值和要查找的值进行比较
    		while (arr[mid] != value) {
    			if (arr[mid] > value) {// 大了
    				max = mid - 1;// 向左边查找
    			} else if (arr[mid] < value) {// 小了
    				min = mid + 1;// 向右边去找查找
    			}
    
    			// 加入判断
    			if (min > max) {
    				return -1;
    			}
    
    			mid = (max + min) / 2;
    		}
    
    		return mid;
    	}
    }

    输出打印索引index=4


    80在数组中的索引明明是80,而这里却是4..显然这是有问题的.。问题就出在排序后改变了数组的索引位置。那如何解决呢?


    使用基本查找方法:

    下面只给出基本查找的方法:

     public static int getIndex(int[] arr,int value) {
    				int index = -1;
    				
    				for(int x=0; x<arr.length; x++) {//遍历数组,逐一比较
    					if(arr[x] == value) {
    						index = x;
    						break;
    					}
    				}
    				
    				return index;
    			}

    这样,这个问题就解决了。



    看标题是Arrays类的前传。那下一篇,就正式进入Arrays类,查找以及排序等等问题将会变的非常非常简单。



    到目前为止,个人博客文章正式达到100篇整。心里很高兴,希望自己的文章,在能提高自己的同时,也能够帮助到更多人。目前java第一季大约四分之一了,第二季的时候会以专题的形式,对每个重点以及一些源码分析做叙述。希望看到的同行互加关注,留下脚印,一起讨论!

  • 相关阅读:
    密码加密
    注册视图
    session会话
    验证码功能
    使用Django表单替代html表单
    实现登陆视图功能
    设计登陆需求页面
    配置视图
    配置数据库
    npm 学习
  • 原文地址:https://www.cnblogs.com/wanghang/p/6299824.html
Copyright © 2011-2022 走看看