数组的算法
目录1. 数组排序
- 冒泡排序:通过重复遍历要排序的数组,比较相邻元素的大小,并在必要时交换它们的位置,直到整个数组排序完成。冒泡排序的时间复杂度为O(n^2),其中n是数组的长度。
- 选择排序:在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
- 插入排序:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序)。
- 快速排序:通过一趟排序将待排记录分隔成独立的两部分,其中一部分的所有记录均比另一部分的所有记录小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。快速排序的平均时间复杂度为O(n log n)。
- 归并排序:是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。归并排序的时间复杂度也是O(n log n)。
2. 数组查找
- 线性查找:逐个检查数组中的每个元素,直到找到所需的特定元素为止。线性查找的时间复杂度为O(n)。
- 二分查找:仅适用于有序数组。通过将数组分成两半,判断所需查找的元素是在左半部分还是右半部分,然后继续在相应的半部分中查找,直到找到所需的元素或确定元素不存在。二分查找的时间复杂度为O(log n)。
3. 数组求和、求最大值和最小值
- 求和:遍历数组,将所有元素相加得到总和。
- 求最大值和最小值:遍历数组,通过比较更新最大值和最小值的记录。
4. 数组反转
- 反转数组即将数组中的元素顺序颠倒。这可以通过交换首尾对应的元素来实现,直到遍历完数组的一半。
5. 数组乱序
- 乱序算法通常用于打乱数组元素的顺序,如Fisher-Yates洗牌算法(也称为Knuth洗牌算法),它能够在O(n)时间复杂度内将数组打乱。
6. 数组复制
- 创建一个新数组,然后将原数组中的元素逐个复制到新数组中。
7. 数组去重
- 遍历数组,使用一个额外的数据结构(如HashSet)来记录已经出现过的元素,从而去除重复元素。