目录
数组的创建与使用
- 一维数组创建
- int arr[]; arr = new int[10]; 先声明,再用new分配内存
- int[] arr = new int[10]; 声明时直接分配内存
- int arr[]; arr = new int[]{1, 2, 3}; 初始化
- int[] arr = {1, 2, 3};
- 二维数组创建
- int arr[][]; arr = new int[2][3]; 先声明,在分配内存
- int[][] arr = new int[2][3]; 声明时直接分配内存
- int[][] arr = new int[2][]; arr[0] = new int[2]; arr[1] = new int[3]; 分别为每一维分配内存
- int[][] arr = {{1, 2},{3, 4}}; 初始化
数组的基本操作
-
获取数组长度
- arr.length; 数组属性length
- 填充替换数组元素
- Arrays.fill(int[] a, int value); 用值填充所有数组值
- Arrays.fill(int[] a, int fromIndex, int toIndex, int value); 填充指定索引范围的值,包括fromIndex,不包括toIndex
- 索引超出范围会报出异常
- 排序
- Arrays.sort(arr); 升序排序
- 复制数组
- Arrays.copyOf(arr, int newlength); 复制数组,指定新数组的长度
- Arrays.copyOfRange(arr, int fromIndex, int toIndex); 复制指定范围的数组到新数组,toIndex可大于arr的长度
- arr.clone(); 克隆数组
- 数组查询
- Arrays.binarySearch(Object, Object key); 在数组中查找key的位置,存在返回索引,不存在返回插入点,返回第一个大于key的元素的负索引{4, 25, 10},若查找8,则返回10的负索引,{4, 8, 10, 25} 中10的索引是2,返回-2
- Arrays.binarySearch(Object, int fromIndex, int toIndex, Object key);
- 返回值没找到时总是返回插入点的负索引,保证了找到时返回值大于等于0
- 索引超出范围会报异常
数组排序算法
- 冒泡排序
- 相邻元素之间比较,并交换。
- 数组长度为len,则外循环控制轮数为从len-1次,内循环控制每一轮的索引从1到新一轮的最后一个元素。轮数增加1,内循环最大索引少1。
- 直接选择排序
- 直接比较,不交换,仅记录索引,每次找出最大值后再进行交换。
- 循环类似冒泡排序,只是比较后更新最小或最大值所在的索引,在内循环结束后直接将最小或最大值与新一轮的最后一个索引进行交换值,最后一个索引为最小或最大值。
- 反转排序
package ex6_array;
public class ex6_20_Sort {
int cmpNum = 0;
int chgNum = 0;
public static void main(String[] args) {
int[] arrOri = {63, 4, 24, 1, 3, 15};
int[] arr = arrOri.clone();
int[] arr2 = arrOri.clone();
int[] arr3 = arrOri.clone();
ex6_20_Sort sorter = new ex6_20_Sort(); //创建排序类的对象
sorter.bubbleSort(arr); //调用冒泡排序方法将数组排序
sorter.selectSort(arr2); //调用直接选择排序方法将数组排序
sorter.reverseSort(arr3); //反转排序
}
/**
* 冒泡排序
*
* @param array 要排序的数组
*/
public void bubbleSort(int[] array) {
cmpNum = 0;
chgNum = 0;
for (int i = 0; i < array.length - 1; i++) {
for (int j = 1; j < array.length - i; j++) {
if (array[j - 1] > array[j]) {
int tmp = array[j - 1];
array[j - 1] = array[j];
array[j] = tmp;
chgNum++;
}
cmpNum++;
}
}
showArray(array);
System.out.println("bubbleSort--" + "cmpNum: " + cmpNum + " chgNum: " + chgNum);
}
/**
* 直接选择排序
*
* @param array 要排序的数组
*/
public void selectSort(int[] array) {
cmpNum = 0;
chgNum = 0;
int index;
for (int i = 0; i < array.length - 1; i++) {
index = 0;
for (int j = 1; j < array.length - i; j++) {
if (array[j] > array[index]) {
index = j;
chgNum++;
}
int tmp = array[array.length - i - 1];
array[array.length - i - 1] = array[index];
array[index] = tmp;
cmpNum++;
}
}
showArray(array);
System.out.println("selectSort--" + "cmpNum: " + cmpNum + " chgNum: " + chgNum);
}
/**
* 反转排序
*
* @param array 要排序的数组
*/
public void reverseSort(int[] array) {
System.out.print("before reverse: ");
showArray(array);
int tmp;
int len = array.length;
for (int i = 0; i < len / 2; i++) {
tmp = array[i];
array[i] = array[len - i - 1];
array[len - i - 1] = tmp;
}
System.out.print("after reverse:");
showArray(array);
}
/**
* 显示数组中的所有元素
*
* @param array 要显示的数组
*/
public void showArray(int[] array) {
for (int x : array) {
System.out.print(x + "-");
}
System.out.println();
}
}