目录
有序数组
有序分为 "升序" 和 "降序"。
如 1 2 3 4 ,依次递增即为升序。
如 4 3 2 1 ,依次递减即为降序.。
冒泡排序题目:
给定一个整型数组, 实现冒泡排序(升序排序)。
核心思想:假设现在数组有n个元素,每进行一次遍历过程,就将当前数组中最大值放在数组末尾,每进行一次遍历,就有一个元素到达了最终位置。
public class Test1 {
/**
* 给定一个整型数组, 实现冒泡排序(升序排序)
*/
public static void main(String[] args) {
int[] arr = new int[]{8, 3, 9, 6, 7, 1};
bubbleSort(arr);
System.out.println("冒泡排序结果为:" + Arrays.toString(arr));
}
public static void bubbleSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) { //外层循环表示进行排序的次数
boolean isSwaped = false;
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) { //前大于后,进行交换
isSwaped = true;
int tmp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = tmp;
}
}
if (!isSwaped) { //内循环无元素交换则isSwaped一直为false,数组为升序,跳出
break;
}
}
}
}
图解
优化部分
利用 boolean 语句增添一个标签,减少循环次数。
内层循环如果没有元素进行交换,此时整个数组肯定是有序数组,标签一直为false。前一个元素永远都比后一个元素小,此时数组一定是个升序数组,排序过程结束。
二分查找题目:
给定一个有序整型数组, 实现二分查找。
核心思想:以升序数组为例,二分查找的思路是先取中间位置的元素,看要找的值比中间元素大还是小。如果小,就去左边找;否则就去右边找。
迭代求解
public class Test2 { /** * 给定一个有序整型数组, 实现二分查找 */ public static void main(String[] args) { int[] a = new int[]{1, 2, 3, 4, 5}; System.out.println(binarySearch(a, 1)); System.out.println(binarySearch(a, 4)); System.out.println(binarySearch(a, 5)); System.out.println(binarySearch(a, 10)); } public static int binarySearch(int[] a, int target) { int l = 0; int r = a.length - 1; while (l <= r) { int m = (l + r) / 2; if (a[m] < target) { // 去左侧区间找 l = m + 1; } else if (a[m] > target) { // 去右侧区间找 r = m - 1; } else { //a[m] == target 说明找到了 System.out.print("找到了,下标为:"); return m; } } //没有找到,返回-1 return -1; } }
递归求解
public class binarySearchRecursion { /** * 二分查找递归版 */ public static void main(String[] args) { int[] a = new int[]{1, 2, 3, 4, 5}; int l = 0; int r = a.length - 1; System.out.println(binarySearchRecursion(a, 2, l, r)); System.out.println(binarySearchRecursion(a, 3, l, r)); System.out.println(binarySearchRecursion(a, 5, l, r)); System.out.println(binarySearchRecursion(a, 10, l, r)); } public static int binarySearchRecursion(int[] a, int target, int l, int r) { int m = (l + r) / 2; if (l > r) { System.out.print("没有找到"); return -1; } else { if (a[m] < target) { return binarySearchRecursion(a, target, m + 1, r); } else if (a[m] > target) { return binarySearchRecursion(a, target, l, m - 1); } else { System.out.print("找到了,下标为:"); return m; } } } }
注意事项: 循环条件必须为 while (l <= r) ,如此可以保证能够判断到数组中最后一个元素。