关于排序算法
比较排序算法的时间复杂度、性能
- 常见的排序算法(内排序):冒泡、直接插入、选择排序、希尔排序、快排、基数排序、堆排序、归并
排序算法 | 特征 | 其他 |
---|---|---|
冒泡排序 | n2 | |
直接插入 | n2,对于接近有序的情况性能比较高 | |
希尔排序 | n1.4,同上,复杂度不太好计算,最坏的情况接近n2 | |
选择排序 | n2 | |
快排 | nlogn,不稳定,但是平均最快的算法 | |
基数排序 | 这个和位数有关,比如:3位,每位的范围为0~k,复杂度为O(3(n+k)) | |
堆排序 | nlogn,不稳定 | |
归并 | nlogn,稳定 |
快排原理
- 快排通过对比双指针大小+交换,每次将一位放到最终位置,使得左右两侧为比他大(或小)的两个集合,然后将问题分解成左右集合的快排,递归下去直到两个数的快排完成,整个快排就完成了,所有数都找到了最终位置。
很大数组筛选重复数字,并行方式和串行方式。
- 对于筛选数字,一个比较好用的数据结构就是Map,典型的有HashMap;而并行和串行的区别就是,串行不需要考虑线程安全的问题,而并行需要,因此我们只需要采用线程安全的数据结构即可,这种方式兼容串行和并行。
- 在Java中有线程安全版的HashMap,叫ConcurentHashmap,我记得它的实现是在原有的Hashmap(数组+列表(红黑树))的基础上再在数组上加锁,好像叫段锁,这样可以保证一个线程在修改这个key下的值的时候其他线程不会同时修改,从而保证了线程安全。