8种排序算法--折半插入算法

来源:互联网 发布:淘宝店铺个人转企业 编辑:程序博客网 时间:2024/05/21 07:59

折半插入排序算法:也叫二分插入排序算法。这种算法和直接插入算法基本一样。都是属于插入排序。所以时间复杂度为N2,空间复杂度为1.最好情况时间复杂度是n。

先看看这种算法思想。

折半插入算法与直接插入不同是:不是比的过程,那是插的过程。二分排序想名字就是把有序的东西分成2半。比如说你向1 2  3  4 5  6这个有序序列插入4,你怎么插,你可以先和6比,在和5比这样可以做。但是作为一个有序序列你如果和中间比,如果比中间大就和后面那一部分比,然后后面又找中间部分。在平均的情况下比直接插这比要快。

例如:有一个数要排列

9   7   6   4   5   1   5   7  

第一趟排,就找第二个数看看和前一个数的大小,然后确定插入的位置

7   9   6   4   5   1   5   7   后面同理

6   7   9   4   5   1   5   7  

4   6   7   9   5   1   5   7  

4   5   6   7   9   1   5   7  

1   4   5   6   7   9   5   7  

1   4   5   5   6   7   9   7  

1   4   5   5   6   7   7   9  

 

看这个排序过程和直接插入排序一模一样只是代码实现上是不同的。不同在向有序序列插入的过程。

大家看看实现代码:

package com.fish.sort;

 

public class MiddleInsertSort {

 

    public static void main(String[] args) {

        int[] array =new int[] { 9, 7, 6, 4, 5, 1, 5, 7 };

        myResult(array);

 

    }

 

    public static void myResult(int[] array) {

        for (int i = 1; i < array.length; i++) {

            // 比较当前数和前一个数的大小

            if (array[i] < array[i - 1]) {

                // 后一个数比前一个数小,就把后面的大数放一个交换区

                int swap = array[i];

                // 定义高低位是用来确定,前面有序序列的大小。low表示有序序列的其实位置,high表示有序序列的末尾。这样的

                // 这的作用是,当你的数要插的时候只要往有序序列里面查就行了。前面这些都和直接排序没有不同。

 

                int low = 0;

 

                int high = i - 1;

                // 下面的循环才是和直接插入不同的。因为直接插入排序是从后往前一个个比较,但是如果试想这个是是最小的你得比i-1次。

                // 因为是有序序列,那么我先和中间比。如果比中间大,我的范围就往后找。每次都和中间比。这样在平均情况下要比直接排序找的快。

                while (low <= high) {

 

                    int mid = (low + high) / 2;

 

                    if (array[mid] < swap) {

                        low= mid + 1;

                    }else {

                        high= mid - 1;

                    }

                }

                // low~i处数据整体向后移动1

                for (int j = i; j > low; j--) {

                    array[j]= array[j - 1];

                }

                array[low]= swap;

 

            }

        }

 

        System.out.println("结果是:");

        for (int i = 0; i < array.length; i++) {

            System.out.print(array[i] +"  ");

        }

    }

 

}

 

我想我讲的够清楚了