数据结构与算法

小德 2021-12-02 12:57:59
Categories: Tags:

数据结构与算法

常用数据结构:数组、栈、队列、链表、树、哈希表、堆、图

数据结构 优点 缺点
数组 插入快 删除慢、大小固定、只能存储单一元素
有序数组 比无需数组查询快 插入删除慢、大小固定、只能存储单一元素
先进后出 存储其他项很慢
队列 先进先出 存储其他项很慢
链表 插入快、删除慢 查找慢
二叉树 如果树是平衡的、则查找、插入、删除都快 删除算法复杂
红黑树 查找、插入、删除都快,树总是平衡的算法复杂 算法复杂
哈希表 如果关键字已知则存取快 删除慢。不知关键字存取慢,堆存储空间使用不充分
插入、删除快,对最大数据项存取快 对其他数据存取慢
对现实世界建模 有些算法慢且复杂

算法

算法简单来说就是解决问题的步骤。
在Java中,算法通常都是由类的方法来实现的。前面的数据结构,比如链表为啥插入、删除快,而查找慢,平衡的二叉树插入、删除、查找都快,这都是实现这些数据结构的算法所造成的。后面我们讲的各种排序实现也是算
法范畴的重要领域。

算法的五个特性

有穷性、确定性、可行性、有输入、有输出

算法的设计原则

正确性、可读性、健壮性、高效率与低存储量需求

冒泡排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static void main(String[] args) {
int [] arr={5,8,1,4,3,9,7,6,2};

for (int i=0;i<arr.length-1;i++){
for (int j=0;j<arr.length-1-i;j++){
if(arr[j]>arr[j+1]){
arr[j]=arr[j]+arr[j+1];
arr[j+1]=arr[j]-arr[j+1];
arr[j]=arr[j]-arr[j+1];
}
}
}

for(int m=0;m<arr.length;m++){
System.out.print(arr[m]+"\t");
}
}

插入排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static void main(String[] args) {
int [] arr={5,8,1,4,3,9,7,6,2};

for (int i=1;i<arr.length;i++){
for (int j=i;j>0;j--){
if(arr[j-1]>arr[j]){
arr[j]=arr[j]+arr[j-1];
arr[j-1]=arr[j]-arr[j-1];
arr[j]=arr[j]-arr[j-1];
}else{
break;
}
}
}

for(int m=0;m<arr.length;m++){
System.out.print(arr[m]+"\t");
}
}

选择排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for (int i=0;i<arr.length-1;i++){
int min=i;
for (int j =i; j < arr.length; j++) {
if (arr[j] < arr[min]) {
min=j;
}
}
//最小值没放到最前面
if(min!=i){
arr[i]=arr[i]+arr[min];
arr[min]=arr[i]-arr[min];
arr[i]=arr[i]-arr[min];
}
System.out.println("第"+(i+1)+"次选择排序的值:");
System.out.println(Arrays.toString(arr));
}

用大 O 表示法都需要 O(N2) 时间级别。

一般不会选择冒泡排序,虽然冒泡排序书写是最简单的,但是平均性能是没有选择排序和插入排序好的。

选择排序把交换次数降低到最低,但是比较次数还是挺大的。当数据量小,并且交换数据相对于比较数据更加耗时的情况下,可以应用选择排序。

在大多数情况下,假设数据量比较小或基本有序时,插入排序是三种算法中最好的选择。