黑马程序员_java_基础_数组和排序



 ——- android培训、java培训、期待与您交流! ———-

JAVA自学系列 
期待与您的交流








一、关于数组的定义和一些列操作

 

类似

int[] arr = new int[2];

或者

int arr[] = new int [2];

或者

int[] arr = new int[]{1,2,3,4};

或者

int[] arr= {1,2,3,4};

几种方式都是可以用来定义一个数组,然后数组名前面的修饰符int也可以切换成其它诸如byte这些。

 

1.数组的遍历

forint x=0;x<数组长度;x++

{

数组[x]

}

 

数组有一个length属性可以用来获取数组长度

 

2.取最值

这里用取最大值举例子

int a=数组[0]

forint x=1;x<数组长度;x++

{

if(a>数组[x])

a = 数组[x]

}

最后得出的a的值,一定是数组中最大值

此处注意,forx的初始值是1而不是0.因为a的初始值为数组[0]

 

2.排序,此处列举两种,冒泡法和比较法

这两种方法其实都差不多,

冒泡法

for(int x=0;x<数组长度-1;x++)

{

for(int y=0;y<数组长度-x-1;y++)

{

if(数组[y]>数组[y+1]);

两值互换;

}

}

比较法

for(int x=0;x<数组长度-1;x++)

{

for(int y=x;y<数组长度;y++)

{

if(数组[x]>数组[y]);

两值互换;

}

}

可以看出这两种方法在语言上看上去是差不多的,然后执行过程中的差别冒泡挨个将最值排到顶端,而比较法是从头开始每个元素都与之后的所有元素做比较,所以冒泡法效率更高一点。

 

3.数组元素的查找

有脚标的情况下可以直接通过,数组[x]的方法获取元素

而有元素的情况下只需要

for(int x=0;x<数组长度;x++)

{

if(数组[x]==元素)

return x;

}

就可以得到该元素脚标的值,在编写此类程序的时候,一般有一个惯例,就是如果所提供的元素在函数中不存在,则我们给出返回值-1,因为负数在数组脚标中是不可能出现的,所以用-1来表示查无此元素。

 

此外若可以确定一个数组中数据是顺序排序的,则此时我们可以使用中间值法来进行更有效率的查找

int x=数组长度-1;

int y=0;

int mu=x+y/2

for(;mu<x&mu>y;)

{

if(元素>数组[mu])

{

y=mu+1;

mu=(x+y)/2;

}

else if (元素<数组[mu])

{

x=mu-1;

mu=(x+y)/2;

}

else

return mu;

}

元素在数组中不存在;

 

 

二、进制的转换

1.十进制转二进制:整数部分除二取余,最后将得出的二进制数串从后往前读,完成 小数部分,乘二取整法,最后得出的结果从前往后读

StringBuffer sb = new StringBuffer()

while(num>0)

{

sb.append(num%2);

num=num/2;

}

输出(sb.reverse());

2.十进制转十六进制:

 

 

 

 

 

最后是关于数组相关操作的一点调试过的代码

 

/*

需求:定义一个数组,并对该数组进行排序,取最值,插入元素,取出元素,取出元素的脚标的操作

思路和步骤:

1.定义数组arr_1,给出一组初始数据

2.针对所需要实现的几个功能,分别创建函数

1.printData()依次打印数组元素

2.buSort()冒泡排序,

3.seSort()选择排序,

 

4.getMax()取最大值,

5.getMin()取最小值,

 

6.outData()取出元素极其脚标

 

注意,当函数有返回值的时候,定义函数时候的数据类型修饰符需要与返回值类型一样

 

*/

import java.util.Scanner;

 

 

class ArrayDemo

{

 

//printData()遍历数组数据,打印数组数据个数,并依次打印数组元素极其脚标并制表

//数组长度可以使用数组的length获取

public static void printData(int[] arr)

{

//定义lenarr长度,方便使用,用for循环完成数组的输出

int len=arr.length;

System.out.println(len+"个元素");

for(int x=0;x<len;x++)

{

//printprintln都用作输出,区别在于后者在输出完成后自动键入换行

System.out.print(x+"\t");

System.out.println(arr[x]);

}

}

//buSort()冒泡排序,正序,

//for循环,依次将每个元素与从做往右同右边紧挨的元素做对比,若比右边大则互换位置

public static void buSort(int[] arr)

{

int len=arr.length;

//第一层for循环,x<len-1,因为最后一位无需比较

for(int x=0;x<len-1;x++)

{

//第二层for循环,-x是因为每次比较的次数都越来越少,-1是为了防止数值越界

for(int y=0;y<len-x-1;y++)

{

if(arr[y]<arr[y+1])

{

int temp = arr[y];

arr[y] = arr[y+1];

arr[y+1] = temp;

}

}

}

//输出结果

printData(arr);

}

//seSort()选择排序,正序

public static void seSort(int[] arr)

{

int len=arr.length;

/*选择排序和冒泡排序语言上最大的不懂就在于第二层for循环上

y的初始值是x+1而冒泡排序y的初始值是0

这两者在执行上的区别就在于:

冒泡排序是元素两两相比

而比较排序是从最开始的值开始,依次同右边的所有值相比较

*/

for(int x=0;x<len-1;x++)

{

for(int y=x+1;y<len;y++)

{

if(arr[x]>arr[y])

{

int temp = arr[x];

arr[x] = arr[y];

arr[y] = temp;

}

}

}

printData(arr);

}

//getMax()取最大值,只需要遍历函数一次然后输出最大值极其脚标即可

public static int getMax(int[] arr)

{

int max = arr[0],len=arr.length;

//for循环处x初始化值之所以是1,是因为max的初始化值是arr[0],没必要再同自己做一次比较

for(int x=1;x<len;x++)

{

if(arr[x]>max)

{

max = arr[x];

}

}

return max;

}

//getMin()取最小值,本质上同上一个函数取最大值相同,只不过if语句的比较变为arr[x]<min而已

public static int getMin(int[] arr)

{

int min = arr[0],len=arr.length;

//for循环处x初始化值之所以是1,是因为max的初始化值是arr[0],没必要再同自己做一次比较

for(int x=1;x<len;x++)

{

if(arr[x]<min)

{

min = arr[x];

}

}

return min;

}

//outData()根据元素取出对应的脚标

//arr依然为数组,x为函数所需要获取的数据值

public static int outData(int[] arr,int a)

{

int len = arr.length;

for(int x=0;x<len;x++)

{

if(arr[x]==a)

{

return x;

}

}

//返回-1值是做此类操作时的惯例,当返回值为-1时,代表该值在数组中不存在

return -1;

}

 

 

//以下函数主要为了方便代码阅读

//

 

//

//

//主函数

 

/*public static void main(String[] args)

{

System.out.println("well");

}

*/

public static void main(String[] args)

{

Scanner sc = new Scanner(System.in);

int[] arr_1 = new int[]{3,5,1,6,13,4,9,7,12,19,8,11};

//为了程序系统之后的复用性,我们定义另外一个数组,将原数组复制,需要的时候可以还原数组状态。

int[] arrRe = arr_1;

/*根据我们定义的几个函数,因为有可能需要输入元素data

而其它几个函数则不需要除数组外的其它变量,因此我们定义data并且不给其赋初始值

作为接受用户输入元素值,定义cho初始值为0来接收用户的选项

使用println输出来打印供用户阅读的界面

*/

int cho = 0;

int data;

boolean x = true,y = true;

for(;y==true;)

{

for(;x==true;x=false)

{

System.out.println("*******************************************************");

System.out.println("1.打印本数组元素");

System.out.println("2.用冒泡法对数组进行排序并打印结果");

System.out.println("3.用选择法对数组进行排序并打印结果");

System.out.println("4.打印数组中的最大值");

System.out.println("5.打印数组中的最小值");

System.out.println("6.查询元素的脚标");

System.out.println("7.");

System.out.println("8.重新打印界面");

System.out.println("9.结束");

System.out.println("*******************************************************");

}

//接受用户输入

cho = Integer.parseInt(sc.next());

switch (cho)

{

case 1:

//打印数组,用已定义好的函数就可以完成

printData(arr_1);

break;

case 2:

buSort(arr_1);

break;

case 3:

seSort(arr_1);

break;

case 4:

System.out.println(getMax(arr_1));

break;

case 5:

System.out.println(getMin(arr_1));

break;

case 6:

data = Integer.parseInt(sc.next());

System.out.println(outData(arr_1,data));

break;

case 7:

break;

case 8:

x=true;

break;

case 9:

System.out.println("结束");

y=false;

break;

default:

break;

}

}

}

}

 ——- android培训、java培训、期待与您交流! ———-

JAVA自学系列 
期待与您的交流


你可能感兴趣的:(黑马程序员_java_基础_数组和排序)