什么是算法
解决某个实际问题的过程和方法!
学习算法的技巧:
1、先搞清楚算法的流程。
2、直接去推敲如何写代码。
1 排序算法-冒泡排序
每次从数组中找出最大值放在数组的后面 去(两两比较)。
2 冒泡排序示例代码
import java.util.Arrays;
/*目标:掌握冒泡排序的编写*/
public class Test1 {
public static void main(String[] args) {
//1、准备一个数组
int [] arr = {4,11,1,33,44,22,55};
//2、定义一个循环控制排几轮
for (int i = 0; i < arr.length-1; i++) {//2.1、7个元素排6轮即可
//i= 0 1 2 3 4 5 【4,11,1,33,44,22,55】 记录每轮比较次数
//i= 0 第一轮 0 1 2 3 4 5 6
//i= 1 第二轮 0 1 2 3 4 5
//...
//i= 5 第六轮 0 1
//3、定义一个循环控制每轮比较几次
for (int j = 0; j <arr.length-i-1; j++) {
//判断当前位置的元素值,是否大于后一个位置的元素值,如果大则交换。
if(arr[j]>arr[j+1]){
int temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
//4、打印数组
System.out.println(Arrays.toString(arr));
}
}
3 排序算法-选择排序
每轮选择当前位置,开始找出后面的较小值与该位置交换(定位选择)
4 选择排序示例代码
import java.util.Arrays;
/*目标:掌握选择排序*/
public class Test2 {
public static void main(String[] args) {
//1、准备好一个数组
int [] arr = {4,6,1,3,8,5};
// 0 1 2 3 4 5
//2、控制选择几轮
for(int i = 0;i<arr.length-1;i++){//6个元素只要选择5轮即可
// i = 0 第一轮 j = 1 2 3 4 5
// i = 1 第二轮 j = 2 3 4 5
// ...
// i = 4 第五轮 j = 5
// 3、控制每轮选择几次。
for (int j = i+1; j <arr.length ; j++) {
//判断当前位置是否大于后面位置处的元素值,若大于则交换。
if(arr[i]>arr[j]){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
}
}
5 查找算法-二分查找
基本查找/顺序查找,在一堆数据中挨个找出想要的数据,所以需要使用二分查找(折半查找)。
注:在数据量特别大的时候,基本查找这种从前往后挨个找的形式,性能是很差的!
二分查找
前提:数组中的数据必须是有序的
核心思想:每次排除一半的数据,查询数据的性能明显提高极多。
1、在起始位置定义一个变量left,在终止位置定义一个变量right
2、位置索引:mid = (left索引+right索引)/ 2=(0+6)/ 2 =3 // 注意:mid保留整数位置
3、索引为3的位置数字是6,小于7,把左边所有数据去掉,继续找右边的数据 //mid位置的数据也去掉
4、继续折半mid=(0+2)=1
5、索引为1的位置数字是11,大于7,把右边的数据去掉(包括mid位置)
6、最后继续折半,发现7=7
结论:二分查找正常的折半条件应该是开始位置left<=结束位置right
/*目标:掌握二分查找算法*/
public class Test3 {
public static void main(String[] args) {
//1、准备好一个数组。
int[] arr = {1, 3, 5, 6, 7, 11, 15};
//把索引打印出来
System.out.println(binarySearch(arr, 111));
}
//设计一个方法来查找
public static int binarySearch(int[] arr, int data) {
//1、定义两个变量,一个站在 左边位置,一个站在右边位置
int left = 0;
int right = arr.length - 1;
//2、定义一个循环控制折半。
while (left <= right) {
//3、计算中间位置
int mid = (left + right) / 2;
//4、判断中间位置的值是否是要查找的值
if (data< arr[mid]) {
//往左边找,截止位置(右边位置) = 中间位置 - 1
right = mid - 1;
}else if(data > arr[mid]){
//往右边找,起始位置(左边位置) = 中间位置 + 1
left = mid + 1;
}else {
//找到了,返回中间位置的值
return mid;
}
}
return -1; //-1特殊结果,代表没有找到该数据,数组中没有该数据!
}
}
以上就是算法的简单了解!