数组:
数组就是一个容器,一定要对这个有一个清楚的认识
求数组中数的最大值
排序
选择排序:
以升序为例
就是拿数组中的第一个数依次跟其他数进行比较,如果发现被比较的数比这个数小,则让这两个数进行互换
然后再拿第二个数进行比较,依次类推
冒泡排序
冒泡排序就是依次拿数组中的两个数进行比较,比完之后把大的数放在右边,这样一来,在进行完第一轮比较之后
最右边的数一定是最大的数;在第二轮比较中,最高位则不用比了
折半选择;
假如你要从一个数组中找到一个元素所对应的角标,就需要用到折半选择
1.第一种方式是通常的思路,先将数组中的数分成两边,让要选择的数跟中间值比较
如果该元素比中间值大,那么就在中间值和最大值之间继续折半选择,(循环的过程)
2.加入在折半的过程中,出现最小值比最大值还大,那么证明已经筛选过了,这个元素并不是该数组中的元素
数组的应用,
求十进制数的二进制和十六进制
其他见程序
面向对象的思想就是指挥对象做事、
class test4
{
public static void main(String[] args)
{
getbin(-2);//求负2的2进制
getoct(-26);//求负26的8进制
gethax(-26);//求负26的十六进制
}
public static void getbin(int num)
{
tool(num,1,1);
}
public static void getoct(int num)
{
tool(num,7,3);
}
public static void gethax(int num)
{
tool(num,15,4);
}
private static void tool(int num,int base,int offset)//自己的写法,无法理解为什么老师if后面有个return
{
if (num==0)
{
System.out.println("0");
return;/*这个return意思是直接返回函数,不在执行下面的数据块,如果没有这个,
那么下面的就要用else包上,
否则,程序在读完if之后会继续读下面的语句块,会提示错误
*/
}
//else
//{
char[] chr={'0','1','2','3','4',
'5','6','7','8','9','A'
,'B','C','D','E','F'};
char[] arr=new char[32];
int pos=arr.length;
while (num!=0)
{
int temp=num&base;
arr[--pos]=chr[temp];
num=num>>>offset;
}
for (int x=pos;x<arr.length ;x++)
{
System.out.print(arr[x]);
}
System.out.println();
//}
}
}
class test5
{
public static void main(String[] args)
{
int[] arr1={3,5,6,1,23,4,54,7,32};
int[] arr2={3,4,1,5,76,22,32,12};
int[] arr3={0,1,2,3,4,5,6,7};
printArray(arr1);
get1(arr1);
printArray(arr1);
printArray(arr2);
get2(arr2);
printArray(arr2);
int x=get5(arr3,6);
System.out.println(x);
}
public static void get1(int[] arr)
{
for (int x=0;x<arr.length;x++)
{
for (int y=x+1;y<arr.length;y++)
{
if (arr[x]>arr[y])
{
swap(arr,x,y);
}
}
}
}
public static void get2(int[] arr)
{
for (int x=0;x<arr.length;x++)
{
for (int y=0;y<arr.length-1-x;y++)
{
if (arr[y]>arr[y+1])
{
swap(arr,y,y+1);
}
}
}
}
public static int get3(int[] arr,int key)
{
int min,max,mid;
min=0;
max=arr.length-1;
mid=(max+min)/2;
if (key<arr[min] || key>arr[max])//条件很重要,容易出错,数组必须是有序的
return -1;
while (key!=arr[mid])
{
if (key>arr[mid])
min=mid+1;
else if (key<arr[mid])
max=mid-1;
mid=(max+min)/2;
}
return mid;
}
public static int get4(int[] arr,int key)
{
int max,min,mid;
min=0;
max=arr.length-1;
mid=0;
while (key!=arr[mid])
{
mid=(max+min)/2;
if (key>arr[mid])
min=mid+1;
else if (key<arr[mid])
max=mid-1;
if (min>max)
return -1;
}
return mid;
}
public static int get5(int[] arr,int key)
{
int max,min,mid;
min=0;
max=arr.length-1;
while (min<=max)//这里没有使用mid,所以前面不用给mid赋值,如果要使用一个变量,必须先给她赋值
{ //上面还有一个思想,就是只要最小角标比最大角标小,就仍然能折半,所以循环就要继续进行下去
mid=(max+min)/2;
if (key<arr[mid])
max=mid-1;
else if (key>arr[mid])
min=mid+1;
else //当循环到min=max的时候,就不用折半了,就证明这个数就是mid,也就是我们所要求的key的角标
return mid;//所以就可以直接返回者mid,下面程序就结束了,不在运行
}
return -1;//如果min>max,也就是最小角标比最大角标大的时候,上面的while就不循环了,就直接输出一个负1
}
/*
举例说明上面的函数
如果数组时{0,1,2,3}要取-2的角标
那么max=3,min=0,首先进0小于3,进入while循环,mid=1,-2<1,所以max=mid-1=0;
此时的min=max=0,所以循环仍然在继续,min=0,读第一个if语句,-2<0也满足条件,所以max=0-1=-1
在进入下一次循环判断,此时,min=0>max,所以循环中断,while不在读,跳出到下面的return -1
*/
private static void swap(int[] arr,int x,int y)
{
int temp= arr[x];
arr[x]=arr[y];
arr[y]=temp;
}
private static void printArray(int[] arr)
{
for (int x=0;x<arr.length ;x++ )
{
if (x!=arr.length-1)
System.out.print(arr[x]+",");
else
System.out.print(arr[x]);
}
System.out.println();
}
}
/*
将一个数组中的元素反转
*/
class test3
{
public static void main(String[] args)
{
int[] arr={1,2,3,4,5,6,7,8,9,10,11};
printArray(arr);
get1(arr);
printArray(arr);
}
/*
定义一个函数用于反转数组
*/
private static void get1(int[] arr)
{
/*int x=0; //第一种写法
int y=arr.length-1;
while (x<y)
{
swap(arr,x,y);
x++;
y--;
}*/
int x=0; //第二种写法
int y=arr.length-1;
while (x<y)
{
//y=arr.length-1-x; //此行可以和x++后面一行进行互换
swap(arr,x,y);
x++;
y=arr.length-1-x;
}
}
/*
定义一个函数用来给数组中的元素进行换位
*/
private static void swap(int[] arr,int x,int y)
{
int temp= arr[x];
arr[x]=arr[y];
arr[y]=temp;
}
/*
定义一个函数用来输出一个数组
*/
private static void printArray(int[] arr)
{
for (int x=0;x<arr.length ;x++ )
{
if (x!=arr.length-1)
System.out.print(arr[x]+",");
else
System.out.print(arr[x]);
}
System.out.println();
}
}