《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第一季大约四分之一了,第二季的时候会以专题的形式,对每个重点以及一些源码分析做叙述。希望看到的同行互加关注,留下脚印,一起讨论!

原文地址:https://www.cnblogs.com/wanghang/p/6299824.html