package com.org.lxh;
import java.util.Arrays;
/**
* 讲解Java数组
* @author hemmingway <hemmingway@163.com>
*
*/
public class ArrayDemo {
/**
* @param args
*/
@SuppressWarnings("unused") //元注释,忽略没有使用的变量
public static void main(String[] args) {
// TODO Auto-generated method stub
//1.数组初始化
//一维数组
int arr1[] = new int[]{33, 4, 56, 45, 3, 96, 13, 5, 77, 1}; //后面用于排序测试
int arr2[] = {1, 2, 4, 5, 6, 7, 10, 19, 20, 23, 27, 33, 41, 55};
int arr3[] = new int[4];
arr3[2] = 6;
//输出数组,for循环遍历一维数组
for(int i = 0; i<arr3.length; i++) //数组有length属性,数组长度
System.out.print(arr3[i] + "\t");
System.out.println(); //换行
//for……each循环遍历数组
String[] value = {"学校", "公司", "hnie.edu.cn", "clr.com"};
//Arrays.sort(value);
for(String item:value){
System.out.print(item + "\t");
}
System.out.println();
//二维数组
int myarr[][] = new int[][]{{12, 0},{45, 23,36}};
int myarr2[][] = {{12, 0},{45, 23, 40}};
int myarr3[][] = new int[2][3];
//2.使用Arrays类复制数组,java.util.Arrays类的使用
System.out.println("遍历数组arr4,同时显示它最近的8的倍数是多少,一个小技巧。");
int[] arr4 = Arrays.copyOfRange(arr2, 5, arr2.length);
int num8;
for(int i =0; i< arr4.length; i++){
num8 = ( arr4[i] + 0x7)&~0x7; //技巧,把一个数升级到8的倍数
System.out.print( arr4[i] + "->" + num8 + "\t");
}
System.out.println();
//3.查找数组,二分查找
Arrays.sort(arr2); //先要排序
int index = Arrays.binarySearch(arr2, 6);
System.out.println("在数组arr2中二分查找6:" + "arr2[" + index + "]=6");
//测试自己写的二分查找
index = binSearch(arr2, 6);
System.out.println("在数组arr2中用自己写的二分查找6:" + "arr2[" + index + "]=6");
//4.排序算法,常见的冒泡排序,选择排序,快速排序
System.out.println("排序算法演示,原先数组元素arr是");
printArr(arr1);
//冒泡排序
int[] arr = Arrays.copyOf(arr1, arr1.length);
System.out.println("冒泡排序");
for(int i=0; i<arr.length; i++){
//比较相邻的两个元素,较大的数往后冒泡
for(int j=arr.length -1; j > i; j--){
if(arr[i] > arr[j]){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
printArr(arr);
//选择排序
arr = Arrays.copyOf(arr1, arr1.length); //数组复位
System.out.println("选择排序");
int idx;
for(int i=0; i < arr.length; i++){
idx = i;
for(int j=i+1; j < arr.length; j++){
if(arr[j] < arr[idx]){ //从数组后面查找较小的元素出来
idx = j;
}
}
//交换两个元素
if(idx != i){
int temp = arr[i];
arr[i] = arr[idx];
arr[idx] = temp;
}
}
printArr(arr);
//快速排序
arr = Arrays.copyOf(arr1, arr1.length); //数组复位
System.out.println("快速排序");
quickSort(arr, 0, arr.length-1);
printArr(arr);
//
}
/**
* 打印数组
* @param arr
*/
private static void printArr(int[] arr){
for(int i = 0; i<arr.length; i++)
System.out.print(arr[i] + "\t");
System.out.println(); //换行
}
/**
* 快速排序算法
* @param arr
* @param loidx
* @param hiidx
*/
public static void quickSort(int[] arr, int loidx, int hiidx){
int lo = loidx;
int hi = hiidx;
int mid;
if(hiidx > loidx){
mid = arr[loidx + (hiidx -lo)/2]; //中间分界元素
while(lo <= hi){
while((lo<hiidx) && (arr[lo] < mid))
++lo;
while((hi > loidx) && (arr[hi] > mid))
--hi;
if(lo<=hi){
swap(arr, lo, hi);
++lo;
--hi;
}
}
}//
if(loidx < hi)
quickSort(arr, loidx, hi);
if(lo < hiidx )
quickSort(arr, lo, hiidx);
}//end quickSort
/**
*
* @param arr
* @param i
* @param j
*/
private static void swap(int[] arr, int i, int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
/**
* 二分查找
* @param arr
* @param k
* @return
*/
public static int binSearch(int[] arr, int k){
//arr需要事先排序
int lo = 0;
int hi = arr.length-1;
while(lo<=hi){
int mid = lo + (hi -lo) / 2;
if(k < arr[mid])
hi = mid-1;
else if(k > arr[mid])
lo = mid +1;
else
return mid;
}
return -1;
}
}
0 0 6 0
学校 公司 hnie.edu.cn clr.com
遍历数组arr4,同时显示它最近的8的倍数是多少,一个小技巧。
7->8 10->16 19->24 20->24 23->24 27->32 33->40 41->48 55->56
在数组arr2中二分查找6:arr2[4]=6
在数组arr2中用自己写的二分查找6:arr2[4]=6
排序算法演示,原先数组元素arr是
33 4 56 45 3 96 13 5 77 1
冒泡排序
1 3 4 5 13 33 45 56 77 96
选择排序
1 3 4 5 13 33 45 56 77 96
快速排序
1 3 4 5 13 33 45 56 77 96