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("数组中不包含该数据");
}
}
}