栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

冒泡排序 + 二分法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

冒泡排序 + 二分法

数组的排序有很多种,这里使用的是很经典的冒泡排序。冒泡排序在每次遍历时会将最大值找出,并移动至最右边,最终得到一个由小到大排序的数组。 

	
	private static void maoPao(int[] arr) {
		// 空的或没元素,不用继续
		if (arr == null || arr.length == 0) {
			return;
		}
		// 第一、定义临时变量
		int t;
		// 第四、是否排序完成
		boolean isSorted;
		// 第二、已经找到一个最大元素了,还需要找到下一个最大、下下一个
		for (int j = 0; jarr[i+1]) { // 当前元素和下一个,如果i<=arr.length - 1的话会出现 arr[arr.length]>arr[arr.length+1],会越界
					// 交换这两个元素
					// 将小的数临时存储
					t = arr[i+1];
					// 交换前后两个数
					arr[i+1] = arr[i];
					// 小的数排在前面
					arr[i] = t;
					// 如果发生了交换,则说明排序未完成
					isSorted = false;
				}
			}
			
			// 可以查看每次排序后结果
			System.out.print("第" + (j + 1) + "次排序后的结果:");
			for (int num : arr) {
				System.out.print(num + " ");
			}
			System.out.println();
			
			// 排序是否已经完成
			if (isSorted) { // 排序完成
				// 可以结束
				break;
			}
		}
	}

二分法是一种常见算法,二分法可以快速的查找一个元素在数组中的位置(时间复杂度O(logN)),相比顺序查找来说二分法的查询效率更高(顺序查找的时间复杂度O(N)),但是需要一个前提,那就是这个数组必须是经过排序的(由小到大),这里使用冒泡排序先将数组排序,再二分查找。

	
	public static int startSearch(int[] arr, int value) {
		// 判断是否是有效数组
		if (arr == null || arr.length == 0) {
			return -1;
		}
		// 使用冒泡排序法排序
		maoPao(arr);
		// 定义开始索引
		int startIndex = 0;
		// 定义最后元素索引
		int endIndex = arr.length - 1;
		// 计算中间索引,int相除不会产生小数
		int midIndex;
		// 开始判断
		while(startIndex <= endIndex) { // 当开始索引与结束索引相等后结束
			// 计算中间索引,int相除不会产生小数
			midIndex = (startIndex + endIndex)/2;
			// 刚好等于中间值
			if (value == arr[midIndex]) {
				return midIndex;
			}
			// 大于,在中位索引的右边
			if (value > arr[midIndex]) {
				// 将起始索引设置为原中位索引的后一位
				startIndex = midIndex + 1;
			} else if (value < arr[midIndex]) { // 如果比中位小,则将最后的索引设置为中位前一位
				endIndex = midIndex - 1;
			}
			// 重新设置中位索引
		}
		return -1;
	}

测试:

public static void main(String[] args) {
		int[] arr = {9, 11, 1, 3, 2, 4, 6, 5, 8, 7};
//		maoPao(arr);
//		// 查看排序后结果
//		System.out.print("排序完成后的数组:");
//		for (int num : arr) {
//			System.out.print(num + " ");
//		}
		// 查询指定元素
		int startSearch = startSearch(arr, 10);
		System.out.println(startSearch);
	}

输出:

第1次排序后的结果:9 1 3 2 4 6 5 8 7 11 
第2次排序后的结果:1 3 2 4 6 5 8 7 9 11 
第3次排序后的结果:1 2 3 4 5 6 7 8 9 11 
第4次排序后的结果:1 2 3 4 5 6 7 8 9 11 
-1

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/340200.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号