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

来源:互联网 发布:系统重装后c盘数据恢复 编辑:程序博客网 时间:2024/04/30 01:08

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

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

1 0
原创粉丝点击