例6:对给定数组进行排序{5,1,6,4,2,8,9}
方法一:选择排序,思路是arr[0]分别与后面的数比较,碰到小的就让小的到前面来,最后最小的肯定在arr[0]的位置上,然后让arr[1]与后面的比,如此循环,得到排序。
- <p><font face="微软雅黑">class ArrayTest2
- {
- public static void selectSort (int[] arr) //定义一个排序的函数
- {
- for (int x = 0 ; x<arr.length ;x++ )
- {
- for (int y = x+1;y<arr.length ; y++ )
- if (arr[x]>arr[y]) //如果前面的数比后面的数要大
- {
- int temp = arr[x]; //前面的数放进变量储存起来
- arr[x] = arr[y]; //后面的数小,放到前面去
- arr[y] = temp; //变量里的数取出来放到后面去
- }
- }
- return;
- }
- public static void printArr(int[] arr) //定义一个打印的函数
- {
- System.out.print("[");
- for (int x = 0 ; x<arr.length ;x++ )
- {
- if (x!=arr.length-1)
- System.out.print(arr[x]+",");
- else
- System.out.print(arr[x]+"]");
- }
- }
- public static void main(String[] args)
- {
- int[] arr ={5,1,6,4,2,8,9};
- selectSort(arr);
- printArr(arr);
- }</font></p><p><font face="微软雅黑">}</font></p>
复制代码
方法二:冒泡排序
思路:让arr[0]与arr[1],arr[1]与arr[2]这种相邻2个数比较,大的去后面,在最后的就是最大的数了,循环上述过程,不过第二次只需要循环到倒数第二位,如此循环即可排序
- <p><font face="微软雅黑">/*
- {5,1,6,4,2,8,9} 冒泡排序
- */
- class ArrayTest3
- {
- public static void bubbleSort(int[] arr)
- {
- for ( int x = 0; x<arr.length-1 ;x++ )
- {
- for (int y = 0; y<arr.length-x-1 ;y++ )
- </font></p><p><font face="微软雅黑"> // -x:让每次比较的数变少,-1:为了不让y+1那个角标越界
- {
- if (arr[y]>arr[y+1])
- {
- int temp = arr[y];
- arr[y] = arr[y+1];
- arr[y+1] = temp;
- }
- }
- }
- }
- public static void printArr(int[] arr)
- {
- System.out.print("[");
- for (int x = 0; x<arr.length ;x++ )
- {
- if (x!=arr.length-1)
- System.out.print(arr[x]+",");
- else
- System.out.print(arr[x]+"]");
- }
- }
-
- public static void main(String[] args)
- {
- int[] arr = {5,1,6,4,2,8,9};
- bubbleSort(arr);
- printArr(arr);
- }
- }</font></p>
复制代码
实际开发时,上面什么选择排序、冒泡排序统统不用,java提供了API供我们调用
- <font face="微软雅黑" color="#ff00ff">import java.util.*;</font><font face="微软雅黑">
- /*
- {5,1,6,4,2,8,9} 冒泡排序
- */
- class ArrayTest3
- {
- public static void printArr(int[] arr)
- {
- System.out.print("[");
- for (int x = 0; x<arr.length ;x++ )
- {
- if (x!=arr.length-1)
- System.out.print(arr[x]+",");
- else
- System.out.print(arr[x]+"]");
- }
- }
-
- public static void main(String[] args)
- {
- int[] arr = {5,1,6,4,2,8,9};
- <font color="#ff00ff">Arrays.sort(arr);</font>
- printArr(arr);
- }
- }</font>
复制代码 实际开发中,2句紫色的语句,就搞定了。
在上面两种排序方法中,有个部分是重复的,都是通过定义第三方变量来实现数组中两个数据的位置互换。那么我们可以定义一个函数来实现这个功能。
- <p><font face="微软雅黑">public static void swap(int[] arr,int a,int b)</font></p><p><font face="微软雅黑">{</font></p><p><font face="微软雅黑"> int temp = int a;</font></p><p><font face="微软雅黑"> int a = int b;</font></p><p><font face="微软雅黑"> int b = temp;
- </font></p><p><font face="微软雅黑">}</font></p>
复制代码 有了个东西,像冒泡排序的這一段
- if (arr[y]>arr[y+1])
- {
- int temp = arr[y];
- arr[y] = arr[y+1];
- arr[y+1] = temp;
- }
复制代码 就可以写成
- <p><font face="微软雅黑">if (arr[y]>arr[y+1]</font></p><p><font face="微软雅黑"> swap (arr,y,y+1);</font></p>
复制代码
就搞定了。
例7:遍历查找
- <font face="微软雅黑">/*
- 遍历查找{3,1,5,4,2,9}
- */
- class ArrayTest4
- {
- public static int getIndex(int[] arr,int key)
- {
- for (int x=0 ; x<arr.length ;x++ ) //角标从0开始自增到角标最大值
- {
- if (arr[x]==key) //如果找到了指定的值
- return x; //返回此值的角标给函数以供调用
-
- }
- return -1; //找不到,说明数组中没有,返回个-1
- }
-
- public static void main(String[] args)
- {
- int[] arr = {3,1,5,4,2,9};
- int Index = getIndex(arr,2);
- System.out.println("Index="+Index);
- }
- }</font>
复制代码
无序数组可以通过遍历查找。如果是有序数组,那么还有更高效的方法:折半查找。
例8:折半查找
方法一:以key是否等于arr[mid]为条件进行循环,直到找到目标为止。
- <p><font face="微软雅黑">/*
- <b><font color="#ff6600">折半查找能提高效率,但要保证是有序排列的数组</font></b>
- */
- class ArrayTest5
- {
- public static void main(String[] args)
- {
- int[] arr = {2,4,5,7,19,32,45};
- int Index = halfSearch(arr,32);
- System.out.println("Index="+Index);
- }
- public static int halfSearch(int[]arr,int key)
- {
- int min=0;
- int max=arr.length-1;
- int mid=(min+max)>>1; //右移1就是除2的1次方,复习一下
- while (key!=arr[mid]) //当key不等于中间角标的数时,
- {
- if (key<arr[mid]) //如果key小于中间的数
- max = mid-1; //最大角标mid-1
- else if (key>arr[mid])//否则如果key大于中间的数
- min = mid+1; //最小角标为mid+1
- if (min>max) //如果min大于max了,说明数组不存在key
- return -1; //返回-1
- mid = (max+min)/2;
- </font></p><p><font face="微软雅黑"> //min或max改变一次后,缩小了一半的范围,重置下mid,继续循环查找key
- }
- return mid; //直到找到了key,跳出循环
- }
- }</font></p>
复制代码
方法二:以min<=max为循环条件,一直减半查找,直到找到目标。
- <font face="微软雅黑">/*
- 折半查找能提高效率,但要保证是有序排列的数组
- */
- class ArrayTest5
- {
- public static void main(String[] args)
- {
- int[] arr = {2,4,5,7,19,32,45};
- int Index = halfSearch(arr,32);
- System.out.println("Index="+Index);
- }
-
- public static int halfSearch(int[]arr,int key)
- {
- int min = 0,max = arr.length-1,mid;
- mid = (min+max)>>1;
- while (min<=max)
- {
- mid = (min+max)>>1;
- if (key<arr[mid])
- max = mid-1;
- else if (key>arr[mid])
- min = mid+1;
- else
- return mid;
- }
- return -1;
- }
- }</font>
复制代码
方法一和方法二的结果自然都是一样的。
那么引申下,如果要往数组中插入个8呢,往哪插?
只需上面的return mid改成return min即可。为什么?
{2,4,5,7,19,32,45}插入8,以方法二为例,
min = 0 ,max = 6,mid=(0+6)/2=3,
arr[3]=7,key>arr[3], min=mid+1;
8是不是就是插在7后面的一个位置啊,那就是min了呗,返还给函数即可
学了数组和函数,现在用学过的只是再来见一下老朋友,进制转换。
例9:十进制转二进制
- <font face="微软雅黑">class ArrayTest6
- {
- public static void main(String[] args)
- {
- toBin(6);
- }
- public static void toBin(int num)
- {
- while (num>0)
- {
- System.out.println(num%2); //二进制就是一个数模2的结果,一个数除2不是0就是1
- num = num/2; //模2后再除2,继续循环
- }
- }
- }</font>
复制代码
6的二进制是110,出来了,看着不太爽,改一下
- <font face="微软雅黑">class ArrayTest6
- {
- public static void main(String[] args)
- {
- toBin(6);
- }
- public static void toBin(int num)
- {
- StringBuffer sb = new StringBuffer(); //建立个对象用来装东西
- while (num>0)
- {
- //System.out.println(num%2); 不打印了,将模2的结果装进容器里
- sb.append(num%2); //将模2的结果装到sb里去,从尾数往里装,结果是反的啊
- num = num/2;
- }
- System.out.println(sb.reverse()); //reverse反转过来打印结果
- }
- }</font>
复制代码
哦了
-------------------------------------------------------------
我是不是太话痨了。。笔记应该言简意赅?居然还超字节 。。。话说不会被认为在灌水吧=,=
|