我走过漫漫求学路
大雪落在求知所依靠的心脏上
昨日种种我弃之如敝履
滚滚洪流中,毁灭自己
——24.2.18
数组常见算法
1.数组翻转
2.冒泡排序
3.二分查找
一、数组翻转
1.概述:数组对称索引位置上的元素互换
2.如何确定数组两端位置?
int min = 0; int max = arr.length-1
3.两个元素怎么换位置?
找一个中间变量,通过给中间变量元素赋值,交换两个变量
4.元素换完位置后,min和max索引元素如何改变?
min++ 往右走 max--往左走
5.换到什么时候不换了?
当min索引大于等于>=max索引时,索引元素位置不变
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int t;
for (int min = 0, max = arr.length - 1; min < max; min++,max--) {
t = arr[min];
arr[min] = arr[max];
arr[max] = t;
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
二、冒泡排序
数组的排序,是将数组中的元素按照大小进行排序,默认都是以升序的形式进行排序,数组排序的方法很多,冒泡排序是最重要的
排序:都要进行数组元素大小的比较,在进行位置的交换,冒泡排序法是采用数组中相邻元素进行比较换位
arr[i]与arr[i+1]是相邻元素
外层循环代表一共需要比较几趟(也就是比较元素数-1),内层循环代表一趟需要和几个元素相比,每趟比较的次数,每趟都少比较一次,比过的元素减去(比较元素数-比较趟数-1)
public static void main(String[] args) {
int[] arr = {1,3,5,8,9,6,4,2};
for (int j = 0; j < arr.length-1; j++) {
for (int i = 0; i < arr.length-1-j; i++) {
if(arr[i]>arr[i+1]){
int t = arr[i];
arr[i] = arr[i+1];
arr[i+1] = t;
}
}
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
}
三、二分查找
1.前提:数组中的数据必须是有序的
2.查询思想:
每次寻找中间索引元素进行比较(每次查询少比较一半元素)
3.中间索引如何查找?
int min = 0
int max = arr.length-1
int mid = (min+max)/2
4.如何比较怎么查询?
if(key>arr[mid]){
min = mid + 1
}else if(key<arr[mid]){
max = mid -1
}else{
返回mid即可
}
5.什么情况下证明找不到?
当min>max时
public static void main(String[] args) {
int[] arr = {1,3,5,7,9,11,13,15,17,19,21,23,25,27};
System.out.println("请输入您要查询的元素:");
Scanner sc = new Scanner(System.in);
int target = sc.nextInt();
int i = 0;
int j = arr.length-1;
int mid = 0;
while(i<=j){
mid = (i+j)/2;
if(target == arr[mid]){
System.out.println("查询的元素位置是"+(mid+1));
break;
} else if (target > arr[mid]) {
i=mid + 1;
}else {
j=mid - 1;
}
}
if(i > j){
System.out.println("查找不到这个元素");
}
}