【小白看的Java教程】第十九章,更復雜一點的陣列操作
陣列拷貝(掌握)
需求:定義一個方法arraycopy完成int型別陣列的拷貝
實現int型別陣列元素拷貝(掌握)
從指定源陣列中從指定的位置開始複製指定數量的元素到目標陣列的指定位置。
src - 源陣列
srcPos - 源陣列中的開始索引位置
dest - 目標陣列
destPos - 目標資料中的開始索引位置
length - 要複製元素的數量
程式碼如下:
package cn.wolfcode.array;
public class ArrayCopyDemo {
public static void main(String[] args) {
int [] a = new int[] { 10, 20, 30, 40, 50, 60, 70 };
int[] b = new int[10];
System.out.println(java.util.Arrays.toString(b));;// 列印拷貝前的陣列
ArrayCopyDemo.arraycopy(a, 2, b, 4, 3);
System.out.println(java.util.Arrays.toString(b));;// 列印拷貝後的陣列
}
static void arraycopy(int[] src, int srcPos, int[] dest, int destPos, int length)
{
for (int index = 0; index < length; index++) {
dest[destPos + index] = src[srcPos + index];
}
}
}
輸出結果:
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 30, 40, 50, 0, 0, 0]
java.lang.System類(會呼叫)
System類中提供了陣列元素拷貝的方法,並且支援任意型別的陣列拷貝,而不僅僅是int型別陣列。
如果還看不懂,使用滑鼠左鍵點選該方法名稱,進入該方法的詳細:
操作程式碼:
package cn.wolfcode.array;
public class ArrayCopyDemo {
public static void main(String[] args) {
int[] a = new int[] { 10, 20, 30, 40, 50, 60, 70 };
int[] b = new int[10];
System.out.println(java.util.Arrays.toString(b));// 列印拷貝前的陣列
System.arraycopy(a, 2, b, 4, 3);
System.out.println(java.util.Arrays.toString(b));// 列印拷貝後的陣列
}
}
排序操作(掌握原理)
需求:完成對int[] arr = new int[]{2,9,6,7,4,1}陣列元素的升序排序操作.
氣泡排序原理(掌握原理)
對未排序的各元素從頭到尾依次比較相鄰兩個元素的大小關係,如果前一個元素大於後一個元素則交換位置,經過第一輪比較後可以得到最大值,同理第二輪比較後出現第二大值等。
針對int[] arr = new int[]{ 2, 9, 6, 7, 4, 1 }陣列元素做排序操作:
該陣列有6個元素,只需要5輪比較。
第1輪比較:需要比較5次,比較完出現最大值。
第2輪比較:需要比較4次,比較完出現第二大值。
第3輪比較:需要比較3次,比較完出現第三大值。
...
可以看出如有N個元素,則需要N-1輪比較,第M輪需要N-M次比較。
交換陣列中兩個元素的方法
static void swap(int[] arr, int index1, int index2) {
int temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
排序程式碼:
package cn.wolfcode.array;
public class ArraySortDemo{
public static void main(String[] args) {
int[] arr = new int[] { 2, 9, 6, 7, 4, 1 };
System.out.println(Arrays.toString(arr));//排序前
ArraySortDemo.sort(arr);
System.out.println(Arrays.toString(arr));//排序後
}
static void sort(int[] arr) {
//第一輪:
for (int i = 1; i <= arr.length-1; i++) {
if (arr[i - 1] > arr[i]) {
ArraySortDemo.swap(arr, i - 1, i);
}
}
//第二輪:
for (int i = 1; i <= arr.length - 2; i++) {
if (arr[i - 1] > arr[i]) {
ArraySortDemo.swap(arr, i - 1, i);
}
}
//第三輪:
for (int i = 1; i <= arr.length - 3; i++) {
if (arr[i - 1] > arr[i]) {
ArraySortDemo.swap(arr, i - 1, i);
}
}
}
}
尋找規律,優化上述程式碼:
static void sort(int[] arr) {
for (int times = 1; times <= arr.length - 1; times++) {
//times表示第幾輪比較,值為:1,2,3,4,5
for (int i = 1; i <= arr.length - times; i++) {
if (arr[i - 1] > arr[i]) {
App.swap(arr, i - 1, i);
}
}
}
}
Arrays類中的排序方法(會呼叫)
Arrays類中已經提高了陣列排序的方法sort,並且是調優之後的,效能非常優異,在開發中只需要我們直接呼叫該方法即可即可。
package cn.wolfcode.array;
public class ArraySortDemo{
public static void main(String[] args) {
int[] arr = new int[] { 2, 9, 6, 7, 4, 1 };
System.out.println(Arrays.toString(arr));//排序前
java.util.Arrays.sort(arr);
System.out.println(Arrays.toString(arr));//排序後
}
}
二分法查詢(掌握原理)
查詢陣列元素的演算法:
+ 線性查詢:從頭找到尾,效能比較低。
+ 二分法查詢(折半查詢):前提陣列元素是有序的,效能非常優異。
二分法搜尋原理(掌握原理)
猜數字遊戲:
電腦隨機生成一個[ 1 , 100 ]之間的整數a,等玩家來猜,猜之後,電腦提示出三種結果:你猜的數偏大,偏小和猜中了。此時為了使用最少次數猜中,玩家必定先猜(1+100)/2的商50,如果此時電腦提示猜的偏小了,那就能推斷出該隨機數在[ 51 , 100 ]之間,此時再猜(51+100)/2的商75,如果電腦提示猜大了,那麼該隨機數必在[ 51 , 74 ]之間,那麼繼續猜(51+74)/2的商,如此每次都可以排除剩下結果一半的可能性,直到猜到為止。
程式碼如下:
package cn.wolfcode.array;
public class ArraySearchDemo{
public static void main(String[] args) {
int[] arr = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int index = ArraySearchDemo.binarySearch(arr, 8);
System.out.println(index);
}
static int binarySearch(int[] arr, int key) {
int low = 0;
int high = arr.length - 1;
while (low <= high) {
int mid = (low + high) / 2;
int midVal = arr[mid];
if (midVal < key) {
low = mid + 1;
} else if (midVal > key) {
high = mid - 1;
} else {
return mid;
}
}
return -1; // 沒有找到
}
}
Arrays類中的二分法查詢方法(會呼叫)
package cn.wolfcode.array;
public class ArraySearchDemo{
public static void main(String[] args) {
int[] arr = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int index = java.util.Arrays.binarySearch(arr, 8);
System.out.println(index);
}
}
小結:排序和二分法查詢的原理需要掌握,會呼叫Arrays類中方法完成相關功能。