冒泡排序 + 二分法

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

	/**
	 * 冒泡排序法
	 * @param arr
	 */
	private static void maoPao(int[] arr) {
		// 空的或没元素,不用继续
		if (arr == null || arr.length == 0) {
			return;
		}
		// 第一、定义临时变量
		int t;
		// 第四、是否排序完成
		boolean isSorted;
		// 第二、已经找到一个最大元素了,还需要找到下一个最大、下下一个
		for (int j = 0; j<arr.length - 1; j++) {
			// 第四、对于已经排序的数组,无需再次进行循环排序
			isSorted = true; // 默认已经排好序
			// 第一、先找出最大的元素
			for (int i = 0; i<arr.length - 1 - j; i++) { // 第三、外层循环了几次,就找到了几个最大,就不需要再比较最后那几个元素
				// 如果当前的元素比下一个大
				if (arr[i]>arr[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)),但是需要一个前提,那就是这个数组必须是经过排序的(由小到大),这里使用冒泡排序先将数组排序,再二分查找。

	/**
	 * 二分法
	 * @param arr
	 * @param value
	 * @return
	 */
	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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值