一、选择排序
思路:
1.首先拿数组第一个元素依次与除其自身外的其他每个元素顺序比较,如果第一个元素大于剩下的某个元素,就互换内容。
2.经过第一轮比较之后,此时,第一个元素就是数组中最小的元素。然后再拿第二个元素与除第一个元素和其自身的元素进行比较,如果第二个元素大于剩下的某个元素,就互换内容。此时,第二个元素就是数组中倒数第二小的元素。
3.依次类推,直到最后一个元素。
1.首先拿数组第一个元素依次与除其自身外的其他每个元素顺序比较,如果第一个元素大于剩下的某个元素,就互换内容。
2.经过第一轮比较之后,此时,第一个元素就是数组中最小的元素。然后再拿第二个元素与除第一个元素和其自身的元素进行比较,如果第二个元素大于剩下的某个元素,就互换内容。此时,第二个元素就是数组中倒数第二小的元素。
3.依次类推,直到最后一个元素。
二、冒泡排序
思路:
1.首先在第一轮排序中,数组从第一个元素到倒数第二个元素依次与其右边的元素进行比较,如果左边的元 素大于右边的元素,那么两个元素就互换。
2.经过第一轮比较,最大的元素就已经存储到数组最右边的结点中了。
3.第二轮排序则是从第一个元素到倒数第三个元素依次与其右边的元素进行比较,如果左边的元素大于右边 的元素,那么两个元素就互换。
4.依照此方式,一直到只有第一和第二个元素互相比较而结束。
1.首先在第一轮排序中,数组从第一个元素到倒数第二个元素依次与其右边的元素进行比较,如果左边的元 素大于右边的元素,那么两个元素就互换。
2.经过第一轮比较,最大的元素就已经存储到数组最右边的结点中了。
3.第二轮排序则是从第一个元素到倒数第三个元素依次与其右边的元素进行比较,如果左边的元素大于右边 的元素,那么两个元素就互换。
4.依照此方式,一直到只有第一和第二个元素互相比较而结束。
三、折半查找(二分查找)
思路:
1.设置三个变量记录角标:min、max、mid。min初始值为0,max为数组最大角标,mid为(max+min)/2。
2.查看mid角标的元素是否与待查找的值相等,如果相等,则直接返回角标值,程序终止执行。
3.如果待查找的值小于角标为mid的元素值,那么说明待查找的元素的位置可能在min与mid角标之间。设置max=mid-1,mid=(max+min)/2,重复第1、2步的操作。
4.如果待查找的值大于角标为mid的元素值,那么说明待查找的元素的位置可能在mid与max角标之间。设
置min=mid+1,mid=(max+min)/2,重复第1、2步的操作。
5.如果数组中不存在待查找的元素,那么按照如上流程,最终min角标值会大于max角标值,此时返回-1。
1.设置三个变量记录角标:min、max、mid。min初始值为0,max为数组最大角标,mid为(max+min)/2。
2.查看mid角标的元素是否与待查找的值相等,如果相等,则直接返回角标值,程序终止执行。
3.如果待查找的值小于角标为mid的元素值,那么说明待查找的元素的位置可能在min与mid角标之间。设置max=mid-1,mid=(max+min)/2,重复第1、2步的操作。
4.如果待查找的值大于角标为mid的元素值,那么说明待查找的元素的位置可能在mid与max角标之间。设
置min=mid+1,mid=(max+min)/2,重复第1、2步的操作。
5.如果数组中不存在待查找的元素,那么按照如上流程,最终min角标值会大于max角标值,此时返回-1。
将以上三种排序方法进行封装。
class ArrayDemo
{
public static void main(String[] args)
{
int arr[] ={23,53,3,55,21,6,57,87,4};//定义一个int类型的数组
int index = getIndex(arr,57);
System.out.print("简单遍历查找:");
System.out.println("index="+index);//打印出index
System.out.print("排列前数组:");
printArray(arr);//调用printArray方法
selectSort(arr);//调用selectSort方法
System.out.print("选择排序后数组:");
printArray(arr);//调用printArray方法
bubbleSort(arr);//调用bubbleSort方法
System.out.print("冒泡排序后数组:");
printArray(arr);//调用printArray方法
System.out.print("二分查找:");
int index1 = binarySearch(arr,55);
System.out.println("index="+index1);//打印出index
}
//选择排序
public static void selectSort(int[] arr)
{
for(int x=0;x<arr.length-1;x++)
{
for(int y =x+1;y<arr.length;y++)
{
if(arr[x]>arr[y])
{
int temp = arr[x];//两数互换
arr[x] = arr[y];
arr[y] = temp;
}
}
}
}
//冒泡排序
public static void bubbleSort(int arr[])
{
for(int x= 0;x<arr.length-1;x++)
{
for(int y=0;y<arr.length-x-1;y++)
{
if(arr[y]>arr[y+1])
{
int temp = arr[y];//两数互换
arr[y] = arr[y+1];
arr[y+1] = temp;
}
}
}
}
//简单遍历查找方式
public static int getIndex(int arr[],int key)
{
for(int x=0;x<arr.length;x++)
{
if(arr[x]==key)
return x;
}
return -1;
}
//二分查找(前提数组有序)
public static int binarySearch(int arr[],int key)
{
int min,max,mid;
min = 0;
max = arr.length-1;
mid = (min+max)/2;
while(arr[mid]!=key)
{
if(arr[mid]<key)
min = mid+1;
else if(arr[mid]>key)
max = mid-1;
if(max<min)
return -1;
mid = (min+max)/2;
}
return mid;
}
//打印数组
public static void printArray(int arr[])
{
System.out.print("[");
for(int x=0;x<arr.length;x++)
{
if(x!=arr.length-1)
System.out.print(arr[x]+",");
else
System.out.println(arr[x]+"]");
}
}
}
练习:获取一个十进制整数的2、8、16进制表现形式
思路:
1.首先判断如果传入的十进制数为0,那么它的2、8、16进制都是0,直接返回0,不需要再执行余下的程序。
2.如下面的示意图中所示,以将十进制数转换成十六进制数为例:
将60与15进行与操作,其值就是60的十六进制的最低位。
再将60无符号右移4位,再与15进行与操作,其值就是60的十六进制的倒数第二位。
3.由上面的例子可以总结出,将一个十进制数转换为十六进制的步骤就是:
将十进制数与15相与,将结果存储到一个数组的最低位。
然后将十进制数右移4位,再与15进行与操作,其值就是该数对应的十六进制的倒数第二位。
再右移4位,与15相与...直到相与结果为0为止。
4.进而可以推理得到,10进制转换为2和8进制的规律与转换为16进制很相似,只是偏移量和相与的数字不同而已。
10进制转换为2进制的偏移量为1,相与数字为1。
10进制转换为8进制的偏移量为3,相与数字为7。
2.如下面的示意图中所示,以将十进制数转换成十六进制数为例:
将60与15进行与操作,其值就是60的十六进制的最低位。
再将60无符号右移4位,再与15进行与操作,其值就是60的十六进制的倒数第二位。
3.由上面的例子可以总结出,将一个十进制数转换为十六进制的步骤就是:
将十进制数与15相与,将结果存储到一个数组的最低位。
然后将十进制数右移4位,再与15进行与操作,其值就是该数对应的十六进制的倒数第二位。
再右移4位,与15相与...直到相与结果为0为止。
4.进而可以推理得到,10进制转换为2和8进制的规律与转换为16进制很相似,只是偏移量和相与的数字不同而已。
10进制转换为2进制的偏移量为1,相与数字为1。
10进制转换为8进制的偏移量为3,相与数字为7。
class ArrayDemo2
{
public static void main(String[] args)
{
toHex(60);//调用toHex方法
toBin(60);//调用toBin方法
toOctal(60);//调用toOctal方法
}
//十进制转二进制
public static void toBin(int num)
{
trans(num,1,1);
}
//十进制转十六进制
public static void toHex(int num)
{
trans(num,15,4);
}
//十进制转8进制
public static void toOctal(int num)
{
trans(num,7,3);
}
//进制转换通用方法
public static void trans(int num,int base,int offset)
{
if(num ==0)
{
System.out.println("0");
return;
}
char[] chs = {'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;//pos为arr的数组长度
while(num!=0){
int temp = num & base;
arr[--pos] = chs[temp];
num = num>>>offset;
}
System.out.println("pos = "+pos);
for(int x = pos;x<arr.length;x++)
{
System.out.print(arr[x]);
}
System.out.println();
}
}
数组中的数组
二维数组[ ][ ]
格式1:
int[ ][ ] arr = new int [3] [2];
1.定义了名称为arr的二维数组。
2.二维数组中有3个一维数组。
3.每一个一维数组中有2个元素。
4.一维数组的名称分别为arr[0],arr[1],arr[2]。
5.给第一个一维数组第一个脚标位赋值为78写法是:arr[0][1]=78;。
6.arr存储的是二维数组的初始地址,arr[0]、arr[1]、arr[2]存储的是一维数组的初始地址。
格式1:
int[ ][ ] arr = new int [3] [2];
1.定义了名称为arr的二维数组。
2.二维数组中有3个一维数组。
3.每一个一维数组中有2个元素。
4.一维数组的名称分别为arr[0],arr[1],arr[2]。
5.给第一个一维数组第一个脚标位赋值为78写法是:arr[0][1]=78;。
6.arr存储的是二维数组的初始地址,arr[0]、arr[1]、arr[2]存储的是一维数组的初始地址。
格式2:
int[ ][ ] arr = new int [3] [ ];
二维数组中有3个一维数组,每个一维数组都是默认初始化值null,可以对这个三个一维数组分别进行初始化。
arr [0]=new int [3];
arr [1]=new int [1];
arr [2]=new int [2];
int[ ][ ] arr = new int [3] [ ];
二维数组中有3个一维数组,每个一维数组都是默认初始化值null,可以对这个三个一维数组分别进行初始化。
arr [0]=new int [3];
arr [1]=new int [1];
arr [2]=new int [2];
格式3:
int [ ][ ] arr = {{3,8,2},{2,7},{9,0,1,6}};
定义一个名称为arr的二维数组,二维数组中的有三个一维数组,每一个一维数组中具体元素也都已初始化。
第一个一维数组arr[0]={3,8,2};,第二个一维数组arr[1]={2,7};,第三个一维数组arr[2]={9,0,1,6};。
第三个一维数组的长度表示方式:arr[2].length;。
int [ ][ ] arr = {{3,8,2},{2,7},{9,0,1,6}};
定义一个名称为arr的二维数组,二维数组中的有三个一维数组,每一个一维数组中具体元素也都已初始化。
第一个一维数组arr[0]={3,8,2};,第二个一维数组arr[1]={2,7};,第三个一维数组arr[2]={9,0,1,6};。
第三个一维数组的长度表示方式:arr[2].length;。
应用:求二维数组所有元素的和。
class Array2Demo
{
public static void main(String[] args)
{
int sum = 0;
int[][] arr = {{3,1,7},{5,8,2,9},{4,1}};//定义一个二位数组
for(int x = 0; x < arr.length; x++)
{
for(int y = 0; y< arr[x].length; y++)
{
sum += arr[x][y];//求和
}
}
System.out.println("sum = " +sum);//打印出sum
}
}