排序系列 之 折半插入排序算法 —— Java实现

 基本思想:

  折半插入算法是对直接插入排序算法的改进,排序原理同直接插入算法:

  把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素;排序过程即每次从无序表中取出第一个元素,将它插入到有序表中,使之成为新的有序表,重复n-1次完成整个排序过程。

  与直接插入算法的区别在于:在有序表中寻找待排序数据的正确位置时,使用了折半查找/二分查找。

 实例:

  (参考直接插入排序算法:http://www.cnblogs.com/snowcan/p/6244128.html)

 与  直接插入算法  相区别的代码(二分查找):

        /**
         * 寻找temp插入有序列表的正确位置,使用二分查找法
         */
        while(low <= high){
            /**
             * 有序数组的中间坐标,此时用于二分查找,减少查找次数
             */
            int mid = (low+high)/2;
            /**
             * 若有序数组的中间元素大于待排序元素,则有序序列向中间元素之前搜索,否则向后搜索
             */
            if(a[mid]>temp){
                high = mid-1;
            }else{
                low = mid+1;
            }
        }                    

 Java实现: 

package sort;
/**
 * 折半插入排序  的实现
 * 稳定算法
 * @author 那一季的银杏叶
 *
 */
public class InsertSort {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int a[] = {3,1,5,7,2,4,9,6};
        new InsertSort().binaryInsertSort(a);
    }

    /**
     * 折半插入排序算法的实现
     * @param a
     */
    private void binaryInsertSort(int[] a) {
        // TODO Auto-generated method stub
        System.out.println("———————————————————折半插入排序算法—————————————————————");
        int n = a.length;
        int i,j;
        for(i=1;i<n;i++){
            /**
             * temp为本次循环待插入有序列表中的数
             */
            int temp = a[i];
            int low=0;
            int high=i-1;
            /**
             * 寻找temp插入有序列表的正确位置,使用二分查找法
             */
            while(low <= high){
                /**
                 * 有序数组的中间坐标,此时用于二分查找,减少查找次数
                 */
                int mid = (low+high)/2;
                /**
                 * 若有序数组的中间元素大于待排序元素,则有序序列向中间元素之前搜索,否则向后搜索
                 */
                if(a[mid]>temp){
                    high = mid-1;
                }else{
                    low = mid+1;
                }
            }

            for(j=i-1;j>=low;j--){
                /**
                 * 元素后移,为插入temp做准备
                 */
                a[j+1] = a[j];
            }
            /**
             * 插入temp
             */
            a[low] = temp;
            /**
             * 打印每次循环的结果
             */
            print(a,n,i);
        }
        /**
         * 打印排序结果
         */
        printResult(a,n);
    }
    /**
     * 打印排序的最终结果
     * @param a
     * @param n
     */
    private void printResult(int[] a, int n){
        System.out.print("最终排序结果:");
        for(int j=0;j<n;j++){
            System.out.print(" "+a[j]);
        }
        System.out.println();
    }
    /**
     * 打印排序的每次循环的结果
     * @param a
     * @param n
     * @param i
     */
    private void print(int[] a, int n, int i) {
        // TODO Auto-generated method stub
        System.out.print("第"+i+"次:");
        for(int j=0;j<n;j++){
            System.out.print(" "+a[j]);
        }
        System.out.println();
    }
}

 运行结果展示:

 (本文仅供学习交流,如有更好的思路,欢迎留下意见供大家探讨学习~)

时间: 2024-10-11 02:37:35

排序系列 之 折半插入排序算法 —— Java实现的相关文章

排序系列 之 直接插入排序算法 —— Java实现

直接插入排序算法 基本思想: 把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素:排序过程即每次从无序表中取出第一个元素,将它插入到有序表中,使之成为新的有序表,重复n-1次完成整个排序过程. 实例: 0.初始状态 3,1,5,7,2,4,9,6(共8个数)    有序表:3:无序表:1,5,7,2,4,9,6 1.第一次循环,从无序表中取出第一个数 1,把它插入到有序表中,使新的数列依旧有序    有序表:1,3:无序表:5,7,2,4,9,6 2

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

直接插入排序(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

[数据结构和算法]折半插入排序算法笔记

/// <summary> /// 步骤: /// 1.记录当前待排元素 /// 2.标记顺序表有序查找区域下界和上界 /// 3.在顺序表有序查找区域中折半查找等待排序元素的位置 /// 4.把顺序表有序查找区域的某些元素后移一位,以空出位置给等待排序的元素 /// 5.在空出的位置填写当前排序元素 /// </summary> /// <param name="elements"></param> static void SqList

数据结构之排序算法Java实现(6)—— 插入类排序之折半插入排序算法

折半插入排序是对直接插入排序进行了改进,在寻找插入点时使用二分查找算法,提高了查询效率. 升序排序: /** * 折半插入排序 * 升序排序 */ @Override public <T extends Comparable<? super T>> void sortByAsc(T[] data) { for(int i = 1;i < data.length;i++ ){ if(data[i].compareTo(data[i - 1]) < 0){ /**记录i的值

两种插入排序算法java实现

两种方法都编译运行通过,可以当做排序类直接使用. 折半插入排序: public class Sort1 { public static void main(String[] args) { InsertSort sort = new InsertSort(); sort.InsertSort(); int[] arr = sort.getarr(); System.out.println(); System.out.println("排序之后:"); for (int ar : arr

折半插入排序算法的C++实现

折半插入排序思想和直接插入排序类似. 1)找到插入位置: 2)依次后移正确位置及后面的元素. 区别是查找插入位置的方法不同. 折半插入排序使用的折半查找法在一个已经有序的序列中找到查找位置. 注意,折半查找法的一个基本条件就是序列已经有序. 直接上代码: #include<iostream> using namespace std; void binaryInsertionSort(int arr[],int n){ int mid; for(int i=1;i<n;i++){ int

插入排序算法--java

插入排序 假设我们输入的是 “5,1,4,2,3” 我们从第二个数字开始,这个数字是1,我们的任务只要看看1有没有正确的位置,我们的做法是和这个数字左边的数字来比,因此我们比较1和5,1比5小,所以我们就交换1和5,原来的排列就变成了“1,5,4,2,3 ” 接下来,我们看第3个数字有没有在正确的位置.这个数字是4,它的左边数字是5,4比5小,所以我们将4和5交换,排列变成了 “1,4,5,2,3 "我们必须继续看4有没有在正确的位置,4的左边是1,1比4小,4就维持不动了. 再来看第四个数字,

【排序】插入排序算法

    特别说明: 对于算法,重在理解其思想.解决问题的方法,思路.因此,以下内容全都假定待排序序列的存储结构为:顺序存储结构. 一:插入排序算法思想 01.设待排序序列为 .插入排序将  划分为由已排序好序的  部分 以及 未排序的  部分组成: 注意:刚开始时  部分其实可认为只有一个元素,即: 元素 02.排序开始时,每次从  序列中(随机,但一般是直接取第一个元素)取出一个元素 ,将其插入到已排好序  部分的"适当位置 ",使得以下条件成立:      ,{ 1  x  i  

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

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