java多线程    Java入门    vsftp    ftp    linux配置    centos    FRP教程    HBase    Html5缓存    webp    zabbix    分布式    neo4j图数据库    

jdk排序算法分析

jdk排序用的什么算法?

jdk排序的过程描述

  1. N<47 插入排序

  2. 47<N<286 双轴快排

  3. 286<N 连续性好 归并排序(Timsort)

  4. 286<N 连续性不好 双轴快排

    所以JDK的这道题考的非常深,你得知道全部jdk内用到的排序算法以及这些算法的时间复杂度。

快速排序

https://pdai.tech/md/algorithm/alg-sort-x-fast.html

堆排序

https://www.bilibili.com/video/BV1Eb41147dK/?spm_id_from=333.788.recommend_more_video.3&vd_source=ddefb78956f7eb0ce3481c729a93431d

xournal 是个很好的写字板

归并排序

https://www.bilibili.com/video/BV1Pt4y197VZ/?spm_id_from=333.337.search-card.all.click&vd_source=ddefb78956f7eb0ce3481c729a93431d

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

问题:为何JDK中的快速排序在元素个数较小时候要用插入排序?

数量非常小的情况下(就像上面说到的,少于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


This entry was posted in JAVA. Bookmark the permalink.
月小升QQ 2651044202, 技术交流QQ群 178491360
首发地址:月小升博客https://java-er.com/blog/jdk-sort-array/
无特殊说明,文章均为月小升原创,欢迎转载,转载请注明本文地址,谢谢
您的评论是我写作的动力.

Leave a Reply