折半直接插入排序

折半直接插入排序:

分析:

         二分查找法:折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的
 中点位置为比较对象,
 如果要找的元素值小于该中点元素,则将待查序列缩小为左半部分,否则为右半部分。通过一次比较,将查找区间缩小一半。
  折半查找是一种高效的查找方法。它可以明显减少比较次数,提高查找效率。但是,折半查找的先决条件是查找表中的数据元素
 必须有序。

   step1. 首先确定整个查找区间的中间位置   mid = ( left + right )/ 2   
   step2. 用待查关键字值与中间位置的关键字值进行比较;   
           若相等,则查找成功   
           若大于,则在后(右)半个区域继续进行折半查找   
           若小于,则在前(左)半个区域继续进行折半查找   
   Step3. 对确定的缩小区域再按折半公式,重复上述步骤。
           最后,得到结果:要么查找成功, 要么查找失败。   
           折半查找的存储结构采用一维数组存放。
      




实现:

        package com.neusoft.data.structure;


import java.util.Arrays;
/*
 * 折半直接插入排序
 */
public class BinInsertSort {
    public static int count = 0;

    public static void main(String[] args) {

        int[] data = new int[] {49,38,10,97,76,13,27};
        System.out.println("原始数据:"+Arrays.toString(data));
        //binaryInsertSort(data);
        binaryInsertSort(data);
        System.out.println("排序后数据:"+Arrays.toString(data));

    }
    /*
     * 二分查找法:折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的
     * 中点位置为比较对象,
     * 如果要找的元素值小于该中点元素,则将待查序列缩小为左半部分,否则为右半部分。通过一次比较,将查找区间缩小一半。
     * 折半查找是一种高效的查找方法。它可以明显减少比较次数,提高查找效率。但是,折半查找的先决条件是查找表中的数据元素
     * 必须有序。

       step1. 首先确定整个查找区间的中间位置   mid = ( left + right )/ 2   
       step2. 用待查关键字值与中间位置的关键字值进行比较;   
               若相等,则查找成功   
               若大于,则在后(右)半个区域继续进行折半查找   
               若小于,则在前(左)半个区域继续进行折半查找   
       Step3. 对确定的缩小区域再按折半公式,重复上述步骤。
               最后,得到结果:要么查找成功, 要么查找失败。   
               折半查找的存储结构采用一维数组存放。

     */
    //它的折半数据是 之前已经排序好的数据
    public static void binaryInsertSort(int[] data) {
        for (int i = 0; i < data.length-1; i++) {
            if (data[i+1]< data[i]) {  //后面的数小于前面的数,想升序排列,因此可以进行折半排序
                // 缓存i处的元素值
                int tmp = data[i+1];
                // 记录搜索范围的左边界
                int low = 0;
                // 记录搜索范围的右边界
                int high = i ;
                //二分查找法
                while (low <= high) {  // 一次对折 两次对折 比较,
                    //核心是使使搜索范围变小 ,找到后就把他们进行位置排序 直到low<high,找到该放置的位置
                    // 记录中间位置
                    int mid = (low + high) / 2;
                    // 比较中间位置数据和i处数据大小,以缩小搜索范围
                    if (data[mid] < tmp) {  //看看在哪个数值的范围,挨个比较其值
                        low = mid + 1;
                    } else {
                        high = mid - 1;
                    }
                }
                //将low~i处数据整体向后移动1位
                for (int j = i; j >=low; j--) {
                    data[j+1] = data[j];
                }
                data[low] = tmp;
                System.out.println("第"+i+"次排序数据:"+Arrays.toString(data));
            }
        }

    }





}

      

输出:

        原始数据:[49, 38, 10, 97, 76, 13, 27]
第0次排序数据:[38, 49, 10, 97, 76, 13, 27]
第1次排序数据:[10, 38, 49, 97, 76, 13, 27]
第3次排序数据:[10, 38, 49, 76, 97, 13, 27]
第4次排序数据:[10, 13, 38, 49, 76, 97, 27]
第5次排序数据:[10, 13, 27, 38, 49, 76, 97]
排序后数据:[10, 13, 27, 38, 49, 76, 97]
      

发布了158 篇原创文章 · 获赞 18 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/yunfengfengfeng/article/details/105532051