码农的空间

codding
随笔 - 80, 文章 - 2, 评论 - 65, 阅读 - 23万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

java实现插入排序

Posted on   我是孙海龙  阅读(9282)  评论(0编辑  收藏  举报

  插入排序是一种通过不断地把新元素插入到已排好序的数据中的排序算法,常用的插入排序算法包括直接插入排序和shell排序,直接插入排序实现比较简单,时间复杂度是O(n),但是直接插入没有充分的利用已插入的数据已经排序这个事实,因此有很多针对直接插入排序改进的算法,例如折半插入排序等,下边是直接插入排序的Java实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void insertSort(int[] elements){
        for(int i = 1;i <elements.length; i++){
            int j = -1;
            while(j <= i && elements[i] > elements[++j]);//找到element[i]应该摆放的位置,此处可以利用查找算法进行优化
            if(j < i){
                //将j之后的数据移动一位,然后把elements[i]移动到j处
                int temp = elements[i];
                for(int k = i-1;k >= j;k--){
                    elements[k+1] = elements[k];
                }
                elements[j] = temp;
            }
        }
}

  另一种常用的插入排序算法:Shell排序也是对直接插入排序算法的一种优化,因此可以说直接插入排序是一种特殊的Shell排序,Shell排序对直接插入排序的优化主要体现在,Shell排序通过使用一个增量序列(递减),每次把要排序的数组分成几个子数组,然后对子数组进行插入排序,这样可以减少比较和移动数据的次数,Shell排序是一种非常高效的排序算法,该算法的思想是:
  1.以h(h一般取n/2)为间隔将n个元素列分为几个小组,在每个小组内按直接插入法排序
  2.令h=h/2,重复第1步
  3.当h=1时,排序结束(此时相当于直接插入排序,不过由于数据已经基本排好序,因此比较次数和移动次数比直接插入排序少很多)
  Shell排序的Java实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static void shellSort(int[] elements){
        for(int h = elements.length/2;h > 0;h /= 2){
             
            for(int i = h;i < elements.length; i++){
                int j = i % h;
                while(j <= i && elements[i] > elements[j]) j += h;//找到element[i]应该摆放的位置
                if(j < i){
                    //将j之后的数据移动h位,然后把elements[i]移动到j处
                    int temp = elements[i];
                    for(int k = i-h;k >= j;k -= h){
                        elements[k+h] = elements[k];
                    }
                    elements[j] = temp;
                }
            }
             
        }
}

编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示