题目:
查找数组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));
}
}
结果: