jdk排序用的什么算法?
N<47 插入排序
47<N<286 双轴快排
286<N 连续性好 归并排序(Timsort)
286<N 连续性不好 双轴快排
所以JDK的这道题考的非常深,你得知道全部jdk内用到的排序算法以及这些算法的时间复杂度。
快速排序
https://pdai.tech/md/algorithm/alg-sort-x-fast.html
堆排序
xournal 是个很好的写字板
归并排序
https://juejin.cn/post/6961260913487773709
https://www.bilibili.com/video/BV1dx411S74x/?spm_id_from=333.337.search-card.all.click&vd_source=ddefb78956f7eb0ce3481c729a93431d 三种排序,冒泡,选择,插入排序
C 语言bubble.c
#include <stdio.h>
void bubble(int arr[], int n){
int i;
i = 10;
printf("%d\n",i);
}
int main(){
printf("a");
}
gcc bubble.c -o bubble
./bubble
快速排序的原理是以最左边的数字为轴,开始比较最右边的数字,如果大于不动,如果小于那么移动到左边
插入排序的原理是前面的是排序好的,把后一个元素插入到前面的序列里
冒泡排序的原理是两两比较,把大的向后移动,一轮下来,最大的数字会移动到数组最右边,重复这个过程
选择排序的原理是选择一个最大的数字,放在最右边,然后接着选择余下的,最大的放次右边。
归并排序的精髓是分组,分完的组再合并回去,因为合并的过程每次两边都是排序好的数,所以最小的比较最小的即可。全部从左边开始比较,就能合并回一个有效顺序,效率较高。
堆排序的原理是建立标准堆,拿走顶部和底部的那个交换,拿走底部的作为最大值,然后重建堆,再交换顶部拿走为次大
https://www.cnblogs.com/baichunyu/p/11935995.html
数量非常小的情况下(就像上面说到的,少于47的),插入排序等可能会比快速排序更快。 所以数组少于47的会进入插入排序。
快排数据越无序越快(加入随机化后基本不会退化),平均常数最小,不需要额外空间,不稳定排序。
归排速度稳定,常数比快排略大,需要额外空间,稳定排序。
所以大于或等于47或少于286会进入快排,而在大于或等于286后,会有个小动作:“// Check if the array is nearly sorted”。这里第一个作用是先梳理一下数据方便后续的归并排序,第二个作用就是即便大于286,但在降序组太多的时候(被判断为没有结构的数据,The array is not highly structured,use Quicksort instead of merge sort.),要转回快速排序。
插入排序最好情况(数组有序)下,插入排序只需遍历数组而不用执行插入操作,其时间复杂度为O(n);最坏情况(数组逆序)和平均情况下复杂度为O(n2)。
快速排序 最好情况(每次将数组分为相等两段),复杂度为O(nlogn);最坏情况(数组有序或逆序),相当于冒泡排序,复杂度为O(n2);平均情况下为O(nlogn)。所以快排属于性能不稳定
堆排序和初始序列无关,各种情况下时间复杂度均为O(n*logn),因此较为稳定
在短序列和元素有序的情况下,插入排序的效率更高;在大部分情况下,快速排序综合性能最高;而不管在什么情况下,堆排序性能都比较稳定。
https://juejin.cn/post/7099712511603113997