Java笔记(排序,查找)

一、排序

概念:让元素按照一定的顺序排列,正序(从小到大)/倒序(从大到小)

1.1冒泡排序

每次都是让相邻的两个数进行比较,如果满足交换条件,则两数交换位置,直到循环结束,例:

public static void bubbleSort(int[] a){
		for (int i = 0; i < a.length-1; i++) {//外循环控制循环次数
			for (int j = 0; j < a.length-1-i; j++) {//内循环控制比较次数
                //当前数大于后数时两数交换交换位置,这样内循环结束后,本次循环中最大的数就会在a[a.length-1-i],这个数就是本次循环的最后一个数
				if (a[j] > a[j + 1]) {
					int temp = a[j];
					a[j] = a[j + 1];
					a[j + 1] = temp;
				}             
			}
		}
	}

循环次数是数组长度减一,因为当循环到最后一次时只剩下了两个数进行比较,如果接着循环的话,那就只剩下最后一个数,已经不需要比较了;
比较次数是数组长度减一再减去循环次数(循环从零开始),原因同上,多循环一次也是只剩下一个数,不需要比较,例:

int[] arr = {2,4,3,5,1}//从小到大排列
第一次:2,3,4,1,5
第二次:2,3,1,4,5
第三次:2,1,3,4,5
第四次:1,2,3,4,5
第四次就是最后两个数进行比较,比较完后数组就排好序了,1也没必要和其他数再比较了
数组长度:5
循环次数:4 = 5-1
比较次数:
    第一次:4 = 5-1-0//循环次数从零次开始
    第二次:3 = 5-1-1
    第三次:2 = 5-1-2
    第四次:1 = 5-1-3//第五次循环次数就是0了,也就不需要接着循环了

1.2选择排序

每次都是让第 i 个数和其他数进行比较,如果arr[index]处的值比其他值大,则将更小的数的下标赋给index,内循环结束后,若满足条件则根据下标交换两数位置(这样就不用每次遇到满足交换条件的两个数时都进行交换,只用将符合条件的下标赋值给index即可)例:

public static void selectionSort(int[] a){
		for (int i = 0; i < a.length-1; i++) {
			int index=i;//用来存储第 i 个数的下标
			for (int j = i+1; j < a.length; j++) {
				if (a[index]>a[j]) {
					//满足交换条件则将新的下标赋值给index
                    index=j;
				}
			}
			if (index != i) {
                //若index不是原来的下标,则表示原来的数不是最小的,则根据下标进行两数交换
				int temp = a[i];
				a[i] = a[index];
				a[index] = temp;
			}
		}
	}

二、查找元素

2.1顺序查找

从左到右依次查询,直到找到目标数据

public static int sequentialSearch(int[] arr, int target) {
		for (int i = 0; i < arr.length; i++) {
			if (arr[i] == target) {
                //找到目标数据则返回下标
				return i;
			}
		}
    	//未找到则返回-1
		return -1;
	}

2.2二分查找

使用条件:所查询的数据必须是有序的

每次都是用中间索引处的值与目标值进行比较,与目标值相等则返回索引(即下标)

若中间索引处的值大于目标值则起始索引不变,结束索引=中间索引-1

若中间索引处的值小于目标值则结束索引不变,起始索引=中间索引+1

中间索引=(起始索引+结束索引)/2

public static int binarySearch(int[] arr, int target) {
		int startIndex = 0;// 起始索引初始值
		int endIndex = arr.length - 1;// 结束索引初始值
		int middle = (startIndex + endIndex) / 2;// 中间索引初始值
		while (startIndex <= endIndex) {
			if (arr[middle] == target) {
				// 中间索引处的值与目标数值相等则直接返回
				return middle;
			} else if (arr[middle] > target) {
				// 若中间索引处的值大于目标值则起始索引不变,结束索引=中间索引-1
				endIndex = middle - 1;
			} else {
				// 若中间索引处的值小于目标值则结束索引不变,起始索引=中间索引+1
				startIndex = middle + 1;
			}
			middle = (startIndex + endIndex) / 2;
		}
		return -1;
	}
  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值