1 进制转换
我们生活中经常是用到的进制是十进制,而其他进制:二进制、八进制、十六进制在计算机和其他领域(中药称重:十六进制)用的较为广泛;
进制间的转换,常用的方法是采用除法取余的方法来计算进制间转换后的数值,也可以使用移位或者&操作完成该功能;
也可以调用系统中的进制转换函数来实现该功能:
String str1 = Integer.toBinaryString(12);//将12转为二进制 ,返回值是 String型
String str2 =Integer.toHexString(12);//将12转为十六进制
String str3 =Integer.toOctalString(12);//将12转为八进制数
在学习中总结的十进制转换成其他进制(二进制、八进制、十六进制)的算法如下:
public static void trans(int num,int base,int offset) //num: 需要转换的数据 base:基数,与之相与后的值便是转换后的进制数值, offset相与后右移的位数
2 排序算法
{
if (num == 0) //如果是0 直接打印0
{
System.out.println(0);
return;
}
char [] ch = {'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;//(相当于取余操作),功能: 取出低位
// 如果转为2进制则与1相与,算出最低位后,右移一位算出次低位,依次算下去
arr[--pos] = ch[temp];//将其存入字符数组中
num = num >>> offset; //右移offset位 如果是一位,相当于模2;三位, 相当于模 7 运算 ;四位,相当于模15
}
for(int x = pos; x<arr.length; x++)
{
System.out.print(arr[x]);//倒序打印,从高位开始打印
}
}
public static void toBin( int num)//十进制转为二进制
{
trans(num,1,1);
}
public static void toOct( int num)//十进制转为八进制
{
trans(num,7,3);
}
public static void toHex( int num)//十进制转为十六进制
{
trans(num,15,4);
}
常用的排序算法有:冒泡排序、选择排序、快速排序和希尔排序等。
下面介绍最常用的的冒泡排序:
冒泡排序算法,就如同该算法的名字一般,
每完成一次内部的for循环,就能将未排序的数据中的最大值(最小值)找出来,
下一次只需要排剩下的n-i个数,直到全部结束,便完成该排序功能。
而且外层循环的次数与数据总数有关,内层循环与需要重新排序的数据的个数有关。
public static void sort(int []arr)
{
int i,j, t;
for(j=0;j<arr.length;j++) //循环arr.length-1次
{
for(i=0;i<arr.length-j-1;i++) //内循环
{
if(arr[i]>arr[i+1]) //从第一个数与其余所有数相比较, 将最最大值放最后 ;
{ //第二次从第一个数和剩余的 arr.length-2个数相比较,得到次大数,直到结束,排序完成
t=arr[i];//借助变量进行值交换
arr[i]=arr[i+1];
arr[i+1]=t;
}
}
}
for(j=0;j<arr.length;j++)
{
System.out.print(arr[j]);
}
}
选择排序:
public static void sort1(int []arr)
{
int min,temp;
for(int i=0;i<arr.length;i++)//循环arr.length-1次
{
for(int j=i+1;j<arr.length;j++)
{
if(arr[i]>arr[j]) //相邻两个进行交换 将最小值往前移
{
temp=arr[j];
arr[j]=arr[i];
arr[i]=temp;
}
}
}
for(int j=0;j<arr.length;j++)打印排序后的数据
{
System.out.print(arr[j]+" ");
}
}
查找算法:
a 最基本的方法:获取需要查找的数据,然后遍历数组进行比较,返回第一次该数据在数组中出现的位置
public static int getIndex(int []arr,int key )
{
for (int x = 0; x < arr.length ; x++)
{
if (arr[x] == key)//相等 说明该数存在数组中
{
System.out.println("该数据存在数组中,并且首次出现的位置是"+(x+1));
return (x+1);
}
}
System.out.println("该数据不在数组中");//否则不存在
return -1;
}
b 二分法查找
二分法查询思想的前提:数据是有序的(升序或降序),
如升序:2,3,5,7,30(降序:10,8,6,4,1)。
然后将需要查找的数据和数组中长度一半的位置开始比较:
如果相等,则找到目标数据;
如果目标数据小于array[middle],则在数组的前一半中继续查找,这时最大角标为 max=middle-1;
否则就只数组的后一半中继续查找,这时最小的角标为min =middle+1;
这样进行下去直到找到目标数据,如果查找不到,说明数据不存在;
这种算法进行一次查找就能省去一半的数据比较,查找效率较高;
public static int Search(int[] array,int value)
{
int min = 0;
int max = array.length-1;
int middle;
while(min <= max)
{
middle = (max+min)/2; //将需要查找的数据和数组中长度一半的位置开始比较:
if(value < array[middle])//如果目标数据小于array[middle],则在数组的前一半中继续查找
// 这时最大角标为 max=middle-1
{
max=middle-1;
}
if(value > array[middle])//否则就只数组的后一半中继续查找,这时最小的角标为min =middle+1
{
min =middle+1;
}
if(array[middle] == value)//如果相等,则找到目标数据
{
return middle;
}
}
System.out.println("该数据不在数组中");
return -1;
}