郑州10kjava上机题(查找数组arr中第k大的奇数,如果不存在则返回0. (arr[i] > 0 (i>=0)))解题思路:冒泡排序

题目:

查找数组arr中第k大的奇数,如果不存在则返回0. (arr[i] > 0 (i>=0))
计算出时间复杂度(注意代码注释,不要使⽤库函数或脚本中已经实现好的排序算法和⼯具, 需要⾃⼰实现数据结构和所需要的算法)
格式:
public int findKth(int[] arr, int k){

//代码
}

我的一种解题思路:

public static int findKth(int[] arr, int k) {
		//冒泡排序
		int temp;
		for (int i = 0; i < arr.length; i++) {
			for (int j = 0; j < arr.length - i - 1; j++) {
				if (arr[j] > arr[j + 1]) {
					temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
		}
		//获取排序后的奇数集合
		List<Integer> list = new ArrayList<>();
		for (int i = 0; i < arr.length; i++) {
			if (arr[i] % 2 ==1) {
				list.add(arr[i]);
			}
		}
		System.out.println(list);
		//取值
		try {
			return list.get(k - 1);
		} catch (Exception e) {
			return 0;
		}

	}

 

 -------------------------------------------------分割线--------------------------------------------

今天突然又想到了冒泡排序,去网上研究了一下,发现冒泡有好多种写法,但思路只有一个,就是没一次排序就把最大的数字放到数组的最后面(从小到大排列)。

我上面写的冒泡每次肯定会循环(数组长度-1次)如果数组本来就是排序好的,就白白循环了那么多次,效率不高。

我又参考别的博客,写了一个效率相对高一点的冒泡(但也不是最优的,谁有更高效的可以评论区告知,都学习了)

public static void main(String[] args) {
		Integer[] arr1 = {99, 111, 3, 9};
		Integer[] arr = {99, 111, 3, 9};
		System.out.println("第一种:");
		maopao1(arr1);
		System.out.println("第二种:");
		maopao2(arr);

	}

	//冒泡1
	public static void maopao1(Integer[] arr) {
		for (int i = 0; i < arr.length; i++) {
			for (int j = 0; j < arr.length - i - 1; j++) {
				if (arr[j] > arr[j + 1]) {
					int temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
			System.out.println("第" + (i + 1) + "轮排序结果");
			System.out.println(Arrays.toString(arr));
		}
	}

	//冒泡2
	public static void maopao2(Integer[] arr) {
		//第一次遍历,把最大的数放置到数组的最后一位
		int i = arr.length - 1;
		//如果i=0数组只有一个元素
		while (i > 0) {
			int flag = 0;
			for (int j = 0; j < i; j++) {
				flag = j;
				//交换位置
				if (arr[j] > arr[j + 1]) {
					int temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
			//让下一次排序结束的位置
			i = flag;
			System.out.println("第" + (i+1) + "轮排序结果");
			System.out.println(Arrays.toString(arr));
		}
	}

结果: 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值