---------------------- ASP.Net+Android+IOS开发 、 .Net培训 期待与您交流! ----------------------
1. 对数组操作最基本的动作就是存和取。操作的核心思想:就是对角标的操作。
2. 数组中最大的角标是:数组的长度-1
3. 选择排序中: x<arr.length-1 外循环的最后一个元素不参与比较
y=x+1 外循环中的第一个元素要和它下一个元素进行比较
冒泡排序中: arr.length-1外循环的最后一个元素不参与比较
y<arr.length-1-x 减1是为了避免角标越界,每循环一次参与比较的元素个数就相应的减少一个。
4. 遍历数组
int [ ] arr={34,19,11,109,3,56};
//正序
for( int x=0; x<arr.length; x++){
System.out.println(arr[x]);
}
//倒序
for( int x=arr.length-1; x>=0; x--){
System.out.println(arr[x]);
}
5. 求最大值
int [ ] arr={34,19,11,109,3,56};
int max=getMax(arr);
System.out.println(“max=”+max);
//通过元素获取最大值
public static void getMax(int [ ] arr){
int maxElement=arr[0];
for( int x=1; x<arr.length; x++){
if( arr[x] > maxElement ){
maxElement=arr[x];
}
}
return maxElement;
}
//通过索引获取最大值
public static void getMax2(int [ ] arr){
int maxIndex=0;
for( int x=0; x<arr.length; x++){
if(arr[maxIndex]> arr[x] ){
maxIndex=x;
}
}
return arr[maxIndex];
}
6. 数组排序(Arrays.sort(Element))
(1)选择排序
int [ ] arr={34,19,11,109,3,56};
selectSort(arr);
printArr(arr);
public static void printArr( 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]+”]”);
}
}
}
//代码提取
public static void swap( int [ ] arr, a, b){
int temp=arr[a];
arr[a]=arr[b];
arr[b]=temp;
}
//选择排序
int [ ] arr={34,19,11,109,3,56};
public static void selectSort (int [ ] arr){
for( int x=0; x<arr.length-1; x++){
int num=arr[x]; //最小值
int index=x;
for( int y=x+1; y<arr.length; y++){
if(arr[y]< num ){
num=arr[y];
index=y;
}
}
if(index!=x){
swap(arr,x,index);
}
}
}
(2)冒泡排序
int [ ] arr={34,19,11,109,3,56};
bubbleSort(arr);
printArr(arr);
方式①
public static void bubbleSort( int [ ] arr){
for( int x=0; x<arr.length-1; x++ ){
for( int y=0; y<arr.length-1-x; y++ ){
if( arr[y] > arr[y+1] ){
swap(arr,y,y+1);
}
}
}
}
方式②
public static void bubbleSort2( int [ ] arr){
for( int x=arr.length-1; x>0; x++){
for( int y=0; y<x; y++){
swap(arr,y,y+1);
}
}
}
(3)排序性能问题
思路:定义变量num,index分别用于记录最小的值,和最小值对应的索引
并让它们的初始值为数组中的第一个元素值和第一个元素的索引
内循环用于找到那个最小的值
把最小值保存到num中,最小值的索引保存到index中。
内循环结束后,把找到的最小值和以前记录的值交换位置,为了避免同一个数和自己交换位置,要判断以前记录的位置的索引和最小值的索引是否相同。
减少堆内存中2个数的交换次数。
int [ ] arr={34,19,11,109,3,56};
public static void sortArr(int [ ] arr){
for( int x=0; x<arr.length-1; x++){
int num=arr[x]; //最小值
int index=x;
for( int y=x+1; y<arr.length; y++){
if(arr[y]< num ){
num=arr[y];
index=y;
}
}
if(index!=x){
int temp=arr[x];
arr[x]=arr[index]
arr[index]=temp;
}
}
}
6. 数组查找
int [ ] arr={34,19,11,109,3,56};
int index= getIndex(arr,10);
System.out.println(“index=”+index);
(1)普通查找
public static int getIndex( int [ ] arr, int key){
for( int x=0; x<arr.length; x++){
if( arr[x] == key){
return x;
}
}
return -1;
}
(2)二分查找法(数组必须有序)
int [ ] arr={13, 15, 19, 28, 33, 45, 78, 106};
public static int halfSearch(int[] arr,int key){
int min,max,mid;
min=0;
max=arr.length-1;
while(min<=max){
mid=(min+max) >>1; //除2向右移1位
if( key > arr[mid]){
min=mid+1;
}
else if( key < arr[mid]){
max=mid-1;
}
else{
return mid;
}
}
return –min-1; //如果存在返回的具体的角标位置,不存在返回的是 -插入点-1
}
7. 折半查找练习
需求:给定一个有序数组,如果往该数组中存储一个元素,并保证这个数组还是有序的,那么这个元素对应的角标如何获取。
int [ ] arr={13, 15, 19, 28, 33, 45, 78, 106};
public static int halfSearch(arr,key){
int min,max,mid;
min=0;
max=arr.length-1;
while(min<=max){
mid=(min+max) >>1; //除2向右移1位
if( key > arr[mid]){
min=mid+1;
}
else if( key < arr[mid]){
max=mid-1;
}
else{
return mid;
}
}
return –min-1; //插入点为 | -min |
}
面试题:
给定一个有序的数组,如果往该数组中存储一个元素,并保证这个数组还是有序的,
那么个元素的存储的角标为如何获取。
{13,15,19,28,33,45,78,106};
halfSearch的返回值+1的绝对值。例如:50 插入点为|-7+1|
8. 数组反转
int[] arr = {4,1,8,7,3,8,2};
public static void reverseArray(int[] arr){
for(int start=0,end=arr.length-1;start<end;start++,end--){
int temp=arr[start];
arr[start]=arr[end];
arr[end]=temp;
}
}
9. int [ ] arr={13, 15, 19, 28, 33, 45, 78, 106};
java中自带的查找方法:(必须导入java.util.*)
Arrays.binarySearch(arr,50); //返回值是-7即-6-1
Arrays.binarySearch(arr,5); //返回值是-1
负数代表不存在,减1是为了避免返回值是0的情况
如果存在返回具体的角标值,不存在返回的是-插入点-1
java中自带的复制方法:
System.arraycopy(源数组,源数组的开始索引, 目标数组, 目标数组的开始索引, 拷贝的长度)
10. 进制转换
public static void main(String[] args)
{
int num=0;
if(num==0){
System.out.print("0");
return;
}
toHex(num);
toOctal(num);
toBinary(num);
}
//十进制-->十六进制
public static void toHex(int num){
trans(num,15,4);
}
//十进制-->八进制
public static void toOctal(int num){
trans(num,7,3);
}
//十进制-->二进制
public static void toBinary(int num){
trans(num,1,1);
}
//进制通用转换
public static void trans(int num,int base,int offset){
char[] arr=new char[32];
int p=arr.length;
char[] chs={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
while(num!=0){
int temp= num & base;
arr[--p] = chs[temp];
num = num >>> offset;
}
//System.out.println("p="+p);
printArray(arr,p);
}
public static void printArray(char[] arr,int p){
for(int x=p;x<arr.length;x++){
System.out.print(arr[x]);
}
System.out.println();
}
11. 查表法应用星期
public static String getWeek( int num){
if(num<1 || num>7){
return;
}
String [ ] week={“ ”,”星期一”, ”星期二”, ”星期三”, ”星期四”, ”星期五”, ”星期六”, ”星期日”};
retrun week[num];
}
---------------------- ASP.Net+Android+IOS开发 、 .Net培训 期待与您交流! ----------------------
详细请查看:http://edu.csdn.net