java从头学04-2[数组应用]

来源:互联网 发布:猴王水果竞猜源码php 编辑:程序博客网 时间:2024/05/16 08:16

一、获取最值

两种思路:记录最大值,或记录最大值的下标,具体代码:

public static int getmax1(int[] arr)

{

int x = arr[0];

for(int i=1;i<arr.length;i++)

{

if (arr[i]>arr[0])

{x=arr[i];}

}

return x;

}

public static int getmax2(int[] arr)

{

int x = 0;

for(int i=1;i<arr.length;i++)

{

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

{x=i;}

}

return arr[x];

}

注意从简单代码中体会复用和封装的优势。


*循环中变量用完即弃,则选择用for()

二、排序

1、选择排序 多次获取最大值,输出相当于下三角,便可使用嵌套循环的思想。

函数参数中获得的是实参,故不需要返回值。指针所指向位置并未变化,而所指向的内容可能发生变化。

2、冒泡排序 相邻元素的互相对比

注:提高效率的方法:尽量不在堆中进行操作,而在栈中进行操作,如在栈中记录脚标的位置。

static void bubblesort(int[] arr)

{


for(i=0;i<arr.length-1;i++)//排序的次数

{

for(j=0;j<arr.length-i-1,j++)//一趟排序,-1为防止越界;-i为比较长度递减

{

if(arr[j]>arr[j+1])//相邻元素的对比

{

swap(arr;j;j+1);

}


}

}


}

*复用性,在不同排序方法中都要用到数据互换,便可以封装成一个函数:static void swap(int[] arr ; int x ; int y)

三、折半查找

抓主要矛盾,循环用while(key!=arr[mid])

防止死循环:min和max 的加1或减1操作

跳出循环的条件:min>max

引申应用:给一个排好序的数组,找出一个元素在数组中插入的位置,返回mid即可。

四、进制转换

1、十to二

模2取整获取每个位的1或0信息

2、二to十六

思路:用移位(<<<,补0的移位)和与运算取每个16进制的位数,便得到该位的数值,再通过判断得到该位数的16进制具体数或字符。

以上可能用到字符串对象的reverse功能。

进阶:用查表方法,将二进制的数值和16进制的字符建立起对应关系,并通过索引找到对应的字符;通过判断num的数是否为0,决定是否需要继续右移取值;通过一个数组保存得到的16进制数;通过pos的值,确定从哪个位置开始打印。

代码:

public static void toHex(int num)

{

char[] chs={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}

char[] hex = new char[8];

int pos=hex.length-1;

while(num!=0)

{

int temp = num & 15;

//system.out.println(chs[temp]);

hex[pos--] = chs[temp];

num=num>>>4;

}

for(int x = pos+1,x<=hex.length;x++)//pos最后的自加操作;借用效应

{

system.out.prinln(hex[x]);

}

}

延展:扩展为多种进制可用的转换。

chs定义不变,和num与的基数变化,可得出如下定义形式:
public static void trans(int num; int base; int offset)

参数:需转换的数,需要与的数;右移的数;

然后再分别定义不同进制的转变,如

public static void toBin(int num)

{ trans(num,1,1)}

具体调用时按情况分别调用toBin即可。









0 0
原创粉丝点击