Java入門-第六節-插入排序和二分法查找
1.插入排序
public class ArraySort{
public static void main(String [] args){
int [] array={1,2,6,7,2,9,12,2};//升序排列
for(int i=1;i<array.length;i++){//i爲待排序數據的下標,由於將第一個元素是有序的,所以i從1開始;i<array:這樣才能遍歷完後續數組,進而實現全部排序;
int willSortData=array[i];//將待排序數據保存到變量willSortData中
int j=0;
/*
*查找待插入數據“應該”插入的下標位置
*/
for(;j<i;j++){//j<i:和待排序數據前面(i)的所有元素進行比較,以找到“應該”插入的下標位置。說明:不能這樣寫j<=i,因爲無需自己和自己比對
if(willSortData<array[j]){//如果條件成立意味着待插入數據小於其前面的某個元素值
break;//當if條件成立時就找到了該待插入數據“應該”插入的下標位置,所以這時必須終止循環
}
}//for循環執行結束意味着找到了待插入數據“應該”插入的下標位置
if(i==j){//i與j相等意味着不用排序,下面代碼也不用執行
continue;//停止不用排序這次循環,進入下次循環
}
/*
*下面循環用於元素後置
*/
for(int k=i;k>j;k--){//int k=i:待插入數據所在位置就是元素後移開始的下標位置;k>j:待插入數據“應該”插入位置(j)就是元素後移結束位置
array[k]=array[k-1];//元素後置
}
/*
*下面代碼用於將待插入數據插入到“應該”插入的下標位置
*/
array[j]=willSortData;
}//該循環體每循環完一次就代表着本次待插入數據已經和前面元素是有序的了
for(int data:array){
System.out.print(data+" ");
}
}
}
2.二分法查找
import java.util.Arrays;
public class Test {
public static int search(int[] array, int data) {
Arrays.sort(array);// 將數組升序排列
int low = 0;
int high = array.length - 1;
while (low <= high) {
int middle = (low + high) / 2;
// 搜索數據與中間元素比較確定在中間元素左邊還是右邊,進而不斷縮小查找範圍
if (data > array[middle]) {//右邊
low = middle + 1;
} else if (data < array[middle]) {//左邊
high = middle - 1;
} else {
return middle;
}
}
return -1;
}
public static void main(String[] args) {
int[] numbers = {5, 1, 7, 3, 2};
int index = search(numbers, 5);
if (index != -1) {
System.out.println("數組中包含該數據");
} else {
System.out.println("數組中不包含該數據");
}
}
}