算法入门
概述
什么是算法?
算法简单来说就是解决问题的步骤。
设计原则:正确性、可读性、健壮性 bug、高效率与低存储。内存+CPU内存占用最小,CPU占用最小,运算速度最快。
评价算法的两个重要指标:
-
时间复杂度:运行一个程序所花费的时间。去掉常数,保留最高阶
一个 while 一个 log(n),一个 for 一个 n
- 常数性时间复杂度 O(1)
- 线性性 O(n) 单层for
- 对数性 nlog(n) 快速排序
- 平方性 O(n^2) 两层for
-
空间复杂度:运行程序所需要的内存,一般就是找数组,容器等
排序算法
- 冒泡排序:其核心就是两两比较,选出大的继续和别人比
- 选择排序:拿出来最高的这个 和所有人去比较,得出位置。
- 插入排序:对一个有序的序列插入,插入进去后保证还是有序的。
- 希尔排序:对插入排序的改进。步长/2,分组,减少比较次数。
- 快速排序:使用递归。根据基准数分组,分成两组,左边的都比基准数小,右边都比之大。
- 归并排序:先分再合。
- 堆排序:是一种选择排序,不稳定排序。堆是一种完全二叉树。参考
- 基数排序:将整数按位数切割成不同的数字,然后按每个位数分别比较。参考
交换两个数,并不一定需要通过第三变量,可以使用加减法
a=2,b=3
a = a + b; //a=5
b = a - b; //b=2
a = a - b; //a=3
冒泡排序
public class BubbleSort {
// 4 2 5 1
// 4
// 4 2 => 2 4
// 2 4 5 =
// 2 4 5 1=> 1 2 4 5
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();
int data[] = new int[n];
for (int i = 0; i < n; i++) {
data[i] = cin.nextInt();
}
// Map size() list.size();
// n = 5
//data 0 1 2 3 4
for (int i = 0, len = data.length; i < len - 1; i++) {
for (int j = 0; j < len - 1 - i; j++) {
if (data[j] > data[j + 1]) {
// 交换 不让你引入第三个变量 交换 a b的值
int temp = data[j];
data[j] = data[j + 1];
data[j + 1] = temp;
}
}
}
for(int i = 0 ; i < n; i++) {
System.out.print(data[i] + " ");
}
System.out.println();
}
}
希尔排序
public class ShellSort {
public static void main(String[] args) {
// 4 1 2 3 5
// 第一步
//len = 5 表示有5个数字
// step = len /2 => 5/2 =2;
// 4 2 =>分出来的还是进行一个插入排序 2 4
// 1 3 => 1 3
// 5=> 5
// 2 4 1 3 5
//100 / 2 = 50
// 50 / 2 => 25
//25 /2
//step = 1排完
// 第二步 step = step / 2 =>1
// 第四步: 1 2 3 4
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();
int data[] = new int[n + 1];
for (int i = 0; i <</