8大内部排序算法学习笔记--(1)插入排序java实现

目前研二,看着研三师兄们找工作的心酸,突然感到比较迷茫。虽然学术科研渐入佳境,但仔细想来,一年以后自己如何找到理想的工作?略作规划之后,开始学习数据结构数算法,学习过程中的一些心得总结下来。

1、内部排序概述

排序(Sorting)是计算机程序设计中的一个重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列。

由于待排序的记录数量不同,使得排序过程涉及的存储器不同,将排序方法分为两大类。

  1. 内部排序:待排序记录存放在计算机随机存储器中进行的排序过程。

  2. 外部排序:待排序记录的数量很大,以至内存一次不能容纳全部记录,在排序过程中尚需对外存进行访问的排序过程。

先来总结一下各种排序之间的关系:

这里写图片描述

综合比较各种内部排序算法,大致结果如下:

这里写图片描述

从上表可以得出如下结论:
1. 从平均时间性能而言,快速排序最佳,其所需时间最省,但快速排序在最坏情况下的时间性能不如堆排序和归并排序。
2. 上表中简单排序包括除希尔排序之外的所有插入排序,起泡排序和简单选择排序,其中以直接插入最为简单,当序列的记录“基本有序”或 n 较小时,它是最佳的排序方法。
3. 从方法稳定性来比较,基数排序是稳定的内部排序,所有时间复杂度为O(n^2)的简单排序方法也是稳定的。然而,快速排序、堆排序和希尔排序等时间性能较好的排序方法是不稳定的。


下面用java语言实现各种内部排序。

(1) 插入排序

1、直接插入排序
  1. 概念:是一种最简单的排序方法,它的基本操作是将一个记录插入到已排好的有序表中,从而得到一个新的有序表。

  2. 基本思想:在要排的一组数中,假设前面(n-1) , n>=2 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得n个数也是排好顺序的。如此循环,直到排好顺序.

  3. 实例

    这里写图片描述

  4. Java实现

  int[] a = { 1, 54, 6, 3, 78, 34, 12, 45, 56, 100 };

  public static int[] insertSort(int[] a) {
        // TODO Auto-generated method stub
        int temp = 0;
        for (int i = 1; i < a.length; i++) {
            temp = a[i];
            int j = i - 1;
            for (; j >= 0 && temp < a[j]; j--) {
                a[j + 1] = a[j];  // 如果temp < a[j], 则整体后移
            }
            a[j + 1] = temp;
        }
        return a;
    }
2、希尔排序
  1. 概念
    希尔排序又称“缩小增量排序”,也是一种插入排序类的方法,但时间效率上较前述几种排序方法大为改进。

  2. 基本思想
    算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。当增量减到1时,进行直接插入排序后,排序完成。

  3. 实例
    这里写图片描述

  4. 基本实现

int[] a = { 49, 38, 65, 97, 76, 13, 27, 49, 55, 4 };
// 希尔排序
    private static int[] shellSort(int[] a) {
        // TODO Auto-generated method stub
        int N = a.length;
        int h = N / 2;
        while (h >= 1) {
            for (int i = h; i < a.length; i++) {
                System.out.println("h = " + h + " i=" + i );
                for (int j = i; j >= h && a[j] < a[j - h]; j -= h) {
                    int temp = a[j];
                    a[j] = a[j - h];
                    a[j - h] = temp;
                    System.out.println("j = " + j);
                }
                 System.out.println(Arrays.toString(a));
            }
            h = h / 2;
        }
        return a;
    }

运行结果

h = 5 i=5
j = 5
[13, 38, 65, 97, 76, 49, 27, 49, 55, 4]
h = 5 i=6
j = 6
[13, 27, 65, 97, 76, 49, 38, 49, 55, 4]
h = 5 i=7
j = 7
[13, 27, 49, 97, 76, 49, 38, 65, 55, 4]
h = 5 i=8
j = 8
[13, 27, 49, 55, 76, 49, 38, 65, 97, 4]
h = 5 i=9
j = 9
[13, 27, 49, 55, 4, 49, 38, 65, 97, 76]
h = 2 i=2
[13, 27, 49, 55, 4, 49, 38, 65, 97, 76]
h = 2 i=3
[13, 27, 49, 55, 4, 49, 38, 65, 97, 76]
h = 2 i=4
j = 4
j = 2
[4, 27, 13, 55, 49, 49, 38, 65, 97, 76]
h = 2 i=5
j = 5
[4, 27, 13, 49, 49, 55, 38, 65, 97, 76]
h = 2 i=6
j = 6
[4, 27, 13, 49, 38, 55, 49, 65, 97, 76]
h = 2 i=7
[4, 27, 13, 49, 38, 55, 49, 65, 97, 76]
h = 2 i=8
[4, 27, 13, 49, 38, 55, 49, 65, 97, 76]
h = 2 i=9
[4, 27, 13, 49, 38, 55, 49, 65, 97, 76]
h = 1 i=1
[4, 27, 13, 49, 38, 55, 49, 65, 97, 76]
h = 1 i=2
j = 2
[4, 13, 27, 49, 38, 55, 49, 65, 97, 76]
h = 1 i=3
[4, 13, 27, 49, 38, 55, 49, 65, 97, 76]
h = 1 i=4
j = 4
[4, 13, 27, 38, 49, 55, 49, 65, 97, 76]
h = 1 i=5
[4, 13, 27, 38, 49, 55, 49, 65, 97, 76]
h = 1 i=6
j = 6
[4, 13, 27, 38, 49, 49, 55, 65, 97, 76]
h = 1 i=7
[4, 13, 27, 38, 49, 49, 55, 65, 97, 76]
h = 1 i=8
[4, 13, 27, 38, 49, 49, 55, 65, 97, 76]
h = 1 i=9
j = 9
[4, 13, 27, 38, 49, 49, 55, 65, 76, 97]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值