黑马程序员 数组的使用

来源:互联网 发布:淘宝连衣裙店铺推荐 编辑:程序博客网 时间:2024/05/01 05:17

---------------------- 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

0 0
原创粉丝点击