直接插入排序与折半插入排序——Java实现

1、直接插入排序

1)原理说明:直接插入排序是一种最简单的插入排序方法,它的基本思想是,仅有一个元素的序列总是有序的,因此,对n 个记录的序列,可从第二个元素开始直到第n 个元素,逐个向有序序列中执行插入操作,从而得到n 个元素按关键字有序的序列。

2)代码实现如下:

package com.test.sort;

public class InsertSort
{

    private static void sort(int[] data)
    {

        for (int i = 1; i < data.length; i++)
        {
            int temp = data[i];
            int j = i - 1;

            while (j >= 0 && temp < data[j])
            {
                data[j + 1] = data[j];
                j--;
            }

            data[j + 1] = temp;
        }
    }

    public static void main(String[] args)
    {
        int[] data = new int[] { 3, 5, 55, 34, 67, 3, 78, 3423, 675, 4567 };
        sort(data);
        System.out.print("Select sort result is: {");

        for (int temp : data)
        {
            System.out.print(temp + "  ");
        }

        System.out.print("}");

    }

}

2、折半插入排序

1)原理说明:折半插入排序是在直接插入排序的基础上,不断对半二分有序序列来寻找插入位置,即搜索插入位置的方法可以使用折半查找实现,是对直接插入排序的一种改进。

2)代码实现如下:

package com.test.sort;

public class binaryInsertSort
{

    private static void sort(int[] data)
    {

        for (int i = 1; i < data.length; i++)
        {
            int temp = data[i];
            int low = 0;
            int high = i - 1;

            while (low <= high)
            {
                int mid = (low + high) / 2;
                if (temp < data[mid])
                {
                    high = mid - 1;
                }
                else
                {
                    low = mid + 1;
                }
            }

            for (int j = i - 1; j > high; j--)
            {
                data[j + 1] = data[j];
            }
            data[high + 1] = temp; // 或者data[low] = temp;

        }
    }

    public static void main(String[] args)
    {
        int[] data = new int[] { 3, 5, 55, 34, 67, 3, 78, 3423, 675, 4567 };
        sort(data);
        System.out.print("Select sort result is: {");

        for (int temp : data)
        {
            System.out.print(temp + "  ");
        }

        System.out.print("}");

    }
}

直接插入排序与折半插入排序——Java实现

时间: 2024-10-12 21:46:17

直接插入排序与折半插入排序——Java实现的相关文章

算法学习之排序算法:插入排序(直接插入排序、折半插入排序、2-路插入排序)

引言: 插入排序作为最简单易于理解的排序算法,基本实现比较简单.本文详细介绍直接插入排序,并给出实现,简单的介绍折半插入排序,并给出2-路插入排序和表插入排序两种插入排序,但并未给出具体实现. 一.直接插入排序 直接插入排序的基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的.记录数增1的有序表. 算法描述: 步骤1.将待排序的一组记录中的第1个记录拿出来作为一组有序的记录(当然此时该组记录仅有1个记录). 步骤2.依次将待排序的一组记录中的记录拿出来插入到前面已排好序的记录中. 步

插入排序(直接插入排序、折半插入排序)

一.直接插入排序 package algorithm.sort.compare.insert; import java.util.Arrays; public class DirectInsertSort { public static void main(String[] args) { int[] arrayA = new int[] {11, 213, 134, 65, 77, 78, 23, 43}; directInsertSort (arrayA); System.out.print

内部排序(3)——插入排序之折半插入排序

因为插入排序的基本思想是在一个有序序列中插入一个新的记录,则能够利用"折半查找"查询插入位置,由此得到的插入排序算法为"折半插入排序".算法例如以下: void BInsertSort () { // 对顺序表L作折半插入排序 for ( i=2; i<length; ++i ) { <span style="white-space:pre"> </span>r[0] = r[i]; // 将r[i]暂存到r[0]

数据结构——排序——直接插入排序和折半插入排序算法

直接插入排序(Insertion Sort)的基本思想是: 每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止. 设数组为a[0…n-1]: 1. 初始时,a[0]自成1个有序区,无序区为a[1..n-1].令i=1 2. 将a[i]并入当前的有序区a[0…i-1]中形成a[0…i]的有序区间. 3. i++并重复第二步直到i==n-1.排序完成. #include<stdio.h> #include<stdbool.h> vo

直接插入排序、折半插入排序、Shell排序、冒泡排序,选择排序

一.直接插入排序 稳定,时间复杂度:最好O(n).最差O(n^2).平均O(n^2).空间复杂度O(1) void InsertSort(int L[], int n) { int i, j,key; for (i = 1; i<n; i++) if(L[i] < L[i-1])//须要将L[i]插入到有序表L[0...i-1] { key = L[i]; for(j = i-1; j >= 0 && key < L[j]; j--)//后移 L[j+1] = L[

插入排序——2折半插入排序实现

折半插入与直接插入的不同在于,搜索要插入的位置的时候,使用的是折半搜索(二分搜索).这种查找方式理论上比顺序查找的效率要高. 其代码实现如下: public IList<int> InsertionSort(int[] ary) { for (int i = 1; i < ary.Length; i++) { int low = 0; int high = i - 1; var key = ary[i]; //不断的折半 while (low <= high)//注意包含等号 {

折半插入排序的代码实现与思考

对于大量的数据,直接插入排序的比较与移动的次数会比较多,在直接插入排序的基础上,为了减少比较的次数,实现了折半插入排序. 折半插入排序主要分为两个部分,第一部分就是找到待排数字应该插入的位置,第二部分就是移动数据,将待排数据插入有序数列中. 数据结构和直接插入排序的数据结构相同,在折半插入排序的代码如下 void BInsertSort(sqList L,int len) { //这个是利用的书上的代码 //在折半插入排序中分为两部分 //其中一部分是利用比较找到应该插入的位置 //另一部分是进

内部排序-&gt;插入排序-&gt;其它插入排序-&gt;折半插入排序

文字描述 和直接插入排序比较,只是把"查找"操作利用"折半查找"来实现,由此进行的插入排序叫做折半插入排序. 示意图 略 算法分析 和直接插入排序比,减少了比较次数,但是移动次数没有变,所以折半插入排序算法的时间复杂度仍然是n*n, 辅助空间为1,是稳定的排序方法. 代码实现 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define EQ(a, b) ((a) == (b)) 5 #defi

排序算法:折半插入排序

算法分析: (1)时间复杂度 从时间上比较,折半查找比顺序查找快,所以就平均性能来说,折半插入排序优于直接插入排序. 折半插入排序所需要的关键字比较次数与待排序序列的初始排列无关,仅依赖于记录的个数.不论初始序列情况如何,在插入第i个记录时,需要经过logi+1(向下取整+1)次比较,才能确定它插入的位置.所以当记录的初始排列为正序或接近正序时,直接插入排序比折半插入排序执行的关键字比较次数要少. 折半插入排序的对象移动次数与直接插入排序相同,依赖于对象的初始排列. 在平均情况下,折半插入排序仅