数组最常见的操作(排序)

/*
对数组操作最基本的动作就是存和取。
核心思想:就是对角标的操作
*/

数组最常见的操作
1.遍历
2.获取最值(最大值,最小值)
/*
思路:
2-1.需要进行比较,并定义变量记录住每次比较后较大的值
2-2.对数组中的元素进行遍历取出和变量中记录的元素进行比较,如果遍历到的元素大于变量中记录的元素,就用变量记录住该较大的值。
2-3.遍历结束,该变量记录的就是最大值

定义一个功能来实现
明确一, 结果。
是数组中的元素,类型为int
明确二,未知内容
数组
*/

package array;

public class ArrayDemo {
	public static void main(String[] args) {
		int [] arr= {3,6,9,40};
	//	int max =getMax(arr);
	int max = getMax_2(arr);
		System.out.println(max);
	}

	public static int getMax(int[] arr) {
		int max = arr[0];
		for (int i = 1; i < arr.length; i++) {
			if (arr[i] > max)
				max = arr[i];
		}
		return max;
	}
	public static int getMax_2(int[] arr) {
		int maxindex = 0;
		for (int i = 1; i < arr.length; i++) {
			if (arr[i] >arr[maxindex] )
				maxindex = i;
		}
		return arr[maxindex];
	}
}

3.排序(选择排序,冒泡排序)
先拿0角标的数值跟后面的角标的数值比较,最终比较出来最小的值,放在0角标上,在那1角标的数值跟后面的比,以此类推,(外循环控制次数(列)角标5的值和角标5的值比较没有意义,所以,外循环<arr.length-1)
在这里插入图片描述

package array;
/*
 * 选择排序,,,从小到大排序
 * */
public class SelectSort {
	public static void main(String[] args) {
		int[] arr = {12,56,19,33,45,66};
		selectSort(arr);
		systemArray(arr);	
	}
	
public static void selectSort(int []arr) {
	for (int x = 0; x <arr.length-1 ; x++) {
		for (int y = x+1; y < arr.length; y++) {
			if (arr[x]>arr[y]) {
				int temp =arr[x];
				arr[x]=arr[y];
				arr[y]=temp;
			}
		}
	}
}

public static void systemArray(int []arr) {
	System.out.print("[");
	for (int j = 0; j < arr.length; j++) {
		if (j!=arr.length-1) {
			System.out.print(arr[j]+",");
			}else {
				System.out.print(arr[j]+"]");
			}
	}
}
}

冒泡排序:
在这里插入图片描述
冒泡排序,在第一次循环的时候,最大值会被排出来,所以在第二次循环的时候,最后的角标上的数,就不用参与排序了。外循环中如果循环到最后一个元素了,就没有相邻数据了,所以arr.length-1(x=0时,确定5角标的数,x=1时,确定4角标的数,以此类推当X=4的时候,1角标的数,就确定下来了。0角标的数不需要和其他数比较了。),内循环arr.length-1-x;一:是为了避免角标越界,二:是为了当外循环增加一次的时候,内循环参与比较的参数个数递减
冒泡排序
还有另一种写法,定义变量记录数,和该数的角标
在这里插入图片描述
在这里插入图片描述

public static void selectSort_2(int[] arr) {
	for (int x = 0; x < arr.length-1; x++) {
		//定义一个变量记录住比较数
		int num = arr[x];
		//定义一个变量记录角标
		int index = x;
		for (int y = 0; y < arr.length; y++) {
			if (num > arr[y]) {
				//如果角标值大于小于记录的值,就讲角标值赋给num
				num = arr[y];
				//将角标赋值给index
				index = y;
			}
		}
		if (index!=x) {
			//换位置
			BubbleSort.app(arr, x, index);
		}
	}
}

4.折半查找(二分查找)
在说二分查找之前,先说一个数组基本查找一个数的方法,如下图
如果找到了,返回该数的角标,没找到返回-1
在这里插入图片描述
二分法的表现:
在这里插入图片描述
例子:

package array;

public class HalfSearchArray {
	public static void main(String[] args) {
		int[] arr = { 15, 16, 17, 18, 19, 20, 25, 160, 170, 180 };
		int halfSearch = halfSearch(arr, 25);
		System.out.println("halfSearch" + halfSearch);
	}

	public static int halfSearch(int[] arr, int key) {
		int max = arr.length - 1;
		int min = 0;
		int mid = (min + max) / 2;
		while (arr[mid] != key) {
			if (key > arr[mid]) {
				min = mid + 1;
			} else if (key < arr[mid]) {
				max = mid - 1;

			}
			if (max < min) {
				return -1;
			}
			mid = (max + min) / 2;
		}
		return mid;
	}
}

二分法的另一种表现形式:
在这里插入图片描述
/*
面试题:
给定一个有序的数组,如果在该数组中储存一个元素,并保证这个数组还是有序的,那么这个元素的储存的角标如何获取。
int[] arr = { 15, 16, 17, 18, 19, 20, 25, 160, 170, 180 };
思考:对有序的数组进行查找,首先想到二分法,
返回值不在返回-1,直接返回min
在真实的开发中 用binarySearch方法,这个方法就是如果你查找的数存在,返回该数的角标,如果该数不存在则返回 -插入点-1
*/

package array;

public class HalfSearchArray {
	public static void main(String[] args) {
		int[] arr = { 15, 16, 17, 18, 19, 20, 25, 160, 170, 180 };
		int halfSearch = halfSearch(arr, 50);
		System.out.println("halfSearch" + halfSearch);
	}

    public static int halfSearch_2(int[] arr, int key) {
    		int max = arr.length - 1;
    		int min = 0;
    		int mid;
    		while (min <= max) {
    			mid = (min + max) >> 1;
    			if (key > arr[mid]) {
    				min = mid + 1;
    			} else if (key < arr[mid]) {
    				max = mid - 1;
    			} else {
    				return mid;
    			}
    		}
    		return min;
    	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值