学习算法的技巧
- 先搞清楚算法的流程
- 直接去推敲如何写代码
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
// 准备一个数组
int[] arr = new int[]{2,6,3,1};
// 定义一个循环控制排几轮
for (int i = 0; i < arr.length - 1; i++) {
// 定义一个循环控制每轮排几次
for (int j = 0; j < arr.length - i - 1; j++) {
int code = 0;
// 判断当前位置的元素值是否大于后一个元素的值,如果大于则交换
if (arr[j] > arr[j+1]){
code = arr[j];
arr[j] = arr[j+1];
arr[j+1] = code;
}
}
}
System.out.println(Arrays.toString(arr));
}
}
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
// 准备一个数组
int[] arr = new int[]{5,1,3,2 };
// 定义一个循环控制排几轮
for (int i = 0; i < arr.length - 1; i++) {
// 定义一个循环控制每轮排几次
for (int j = i+1; j < arr.length; j++) {
// 判断当前位置的元素值是否大于后一个元素的值,如果大于则交换
if (arr[i] > arr[j]){
int code = arr[i];
arr[i] = arr[j];
arr[j] = code;
}
}
}
System.out.println(Arrays.toString(arr));
}
}
注意:在数据量特别大的时候,基本查找这种从前往后挨个查找的形式,性能是很差的。
结论:二分查找正常的折半条件应该是开始位置left <= 结束位置right。
public class Test {
public static void main(String[] args) {
// 准备一个数组
int[] arr = new int[]{7,23,79,81,103,127,131,147};
System.out.println(binarySearch(arr, 81));
}
public static int binarySearch(int[] arr,int data){
// 定于两个变量,一个在左边位置,一个在右边位置
int left = 0;
int right = arr.length - 1;
// 定义一个循环控制折半
while (left <= right){
// 每次折半,都算出中间位置的索引
int middle = (left+right)/2;
// 判断当前要找的元素值与中间位置处的元素值的大小情况
if (data < arr[middle]){
// 往左边找,截至位置(右边位置) = 中间位置 - 1
right = middle - 1;
}else if (data > arr[middle]){
// 往右边找,截至位置(左边位置) = 中间位置 + 1
right = middle - 1;
}else {
// 中间位置处的元素值,正好等于我们要找的元素值
return middle;
}
}
return -1; //-1特殊结果,就代表没有找到!数组中不存在
}
}