Java序谈之数组排序(冒泡、选择、二分查找)

来源:互联网 发布:道路测量员软件说明书 编辑:程序博客网 时间:2024/05/18 18:16

数组

定义一维数组和二维数组以及多维数组

一维:int [ ] array = new int [ ];    int [ ] array = { };   int [ ] array = new int [ ] { };这种书写不可填入数组元素数目

二维:int [ ] [ ] array = new int [ ] [ ] ; int [ ] [ ] array = { { },{ },{ } }; int [ ] [ ] array = new int [ ] [ ]{ { }, { },{ }};也不能写数组元素数目

根据索引找数组中的元素

需求:能够根据用户输入的1,返回一,输入的2,返回二

思路:已有的条件(索引,数组),直接利用数组元素输出语句求出数组中对应元素

代码实现:

public static char fanhui(int a) {char []print= {'一','二','三','四','五','六','七'};return print[a-1];}

根据提供的数组中元素找出索引

需求:有数组 int [ ] array={1,2,3,4},求出3在数组中的角标位置

分析:可以将这个功能封装成一个函数,输入数组和要查找的元素作为参数即可查找

代码实现:

public static int weizhi(int n,int []a) {//定义一个变量,index保存下标//如果索引的初值为零,当数组的长度为零的时候,会直接返回零,会与数组真正的下标零混淆int index = -1;for(int x=0;x<a.length;x++) {if(a[x] == n) {index = x;return index;//return x :这里已经把值返回了,结束整个函数,后面不管写什么都没有意义,跟break、continue差不多}}return index;}

小结:代码中 int index = -1;return index;可以防止出现空数组的情况

数组自身元素的反转

需求:int [ ] array={1,4,2,5,3,,6};实现这个数组的反转

分析:可以取数组长度的中间值,然后以这个中间值为条件,在For循环中将数组进行反转

public static void change(int[] array) {int number = array.length / 2;for (int x = 0; x < number; x++) { int c; c = array[x]; array[x] = array[array.length - 1 - x]; array[array.length - x - 1] = c;//此时在调用函数的时候,相当于值的传递,这样交换不了两个数的值(不同空间中没关系)//kk(array[x], array[array.length - 1 - x]);}System.out.println(Arrays.toString(array));}

小结:在这里交换两个数值的时候,不可以调用一个封装这个功能的函数,因为两个函数是栈中不同的空间,另一个函数中数值的交换对于另一个函数没有影响

数组的冒泡排序

定义:数组中相邻的两个元素之间进行比较

核心:相邻的元素进行比较

分析:冒泡排序的结果是升序,每趟得出最后位的最大值,可以使用外循环控制比较的趟数,内循环控制每趟比较的次数

代码实现:

public static void sort(int []a) {for(int x = 0; x < a.length-1; x++) {for( int y = 0; y<a.length-1-x; y++) {if( a[y] > a[y+1] ) {int c = a[y];a[ y ] = a[y+1];a[ y + 1] =  c;}}}}

分析:外循环中:数组的第一个数不用跟自己比较,所以比较次数为x=a.length-1

           内循环中:-1:当不加-1的时候,a[ y ]可以取到a.length-1,那么a[y+1]=a.length,就会溢出报错

                             -x:每趟循环的次数在减少,减少的值正好是每次外循环的x的大小

数组的选择排序

定义:数组的每个元素跟之后的每个元素进行比较

分析:选择排序是升序,每次循环可得到首个位置的最小值,使用外循环控制循环躺数,内循环控制每趟比较次数

代码实现:

public static void main(String[] args) {int []num= {1,3,4,32,2,43,5};//x<num.length-1  外循环最后一个数不用再比较了for(int x = 0; x<num.length-1; x++) {//y=x+1 每次都可以少比一个数for(int y=x+1;y<num.length;y++) {if(num[x]<num[y]) {int c=num[x];num[x]=num[y];num[y]=c;}}}System.out.println(Arrays.toString(num));}
小结:外循环中:-1:最后一个数不用跟自己比较,所以比较次数是 x=num.length-1

           内循环中:x+1:每次内循环都是从比较元素后面的一个元素依次向后比较

数组的折半查找

定义:给定一个数,在数组查找,通过不断跟数组中间角标所属数值进行比较,缩小范围,更快得出结果。

实现代码:

int min = 0;int max = array.length-1 ;int mid = (max + min) / 2;//声明要查找的值int key = 11;//循环查找,循环体里要有折半的操作//为什么使用while循环?因为我现在已经明确知道循环什么时候停止//key和中间角标的值比较,如果相等循环停止while(key != array[mid]) {if(key > array[mid]) {min = mid + 1;}else if(key < array[mid]) {max = mid-1;}//重复折半的操作//最终正好是max=min,这时候得到那个角标mid = ( max+min )/2;//如果数组中没有这个数,会造成死循环,需要一个出口让程序停止if(min>max) {//说明这里没找到这个数mid = -1;//相当于给了一个标志break;}}System.out.println("坐标"+mid);

二维数组

命名规范: int [ ] [ ] array = new int [x ] [y ];  int [ ] [ ] array={ { },{ },{ }};

以上命名方式一种:x:代表二维数组种一维数组个数 y:代表每个一维数组中元素个数

需求:遍历二维数组

代码实现:

System.out.println(array1.length);//二位数组的长度是一维数组的个数for(int x=0; x<array1.length; x++) {for(int y= 0 ; y < array1[x].length; y++){System.out.print(array1[x][y] + " ");}System.out.println();}



阅读全文
0 0
原创粉丝点击