经典排序算法(4)——折半插入排序算法详解

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

折半插入排序(Binary Insertion Sort)是一种插入排序算法,通过不断地将数据元素插入到合适的位置进行排序,在寻找插入点时采用了折半查找。


一、算法基本思想

(1)基本思想

折半插入排序的基本思想是:顺序地把待排序的序列中的各个元素按其关键字的大小,通过折半查找插入到已排序的序列的适当位置。

(2)运行过程

直接插入排序的运作如下:

1、将待排序序列的第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。

2、从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置,在查找元素的适当位置时,采用了折半查找方法。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)

(3)示例



二、算法实现(核心代码)

C++实现:

void binary_insertion_sort(int arr[], int len) {        int i, j, temp, m, low, high;        for (i = 1; i < len; i++)        {               temp = arr[i];               low = 0; high = i-1;               while (low <= high)               {                      m = (low +high) / 2;                      if(arr[m] > temp)                               high = m-1;                      else                               low = m+1;               }         }         for (j = i-1; j>=high+1; j--)               arr[j+1] = arr[j];         arr[j+1] = temp;}

Java实现:

public void binary_insertion_sort(int arr[]) {        int i, j, temp, m, low, high, len = arr.length;        for (i = 1; i < len; i++)        {               temp = arr[i];               low = 0; high = i-1;               while (low <= high)               {                      m = (low +high) / 2;                      if(arr[m] > temp)                               high = m-1;                      else                               low = m+1;               }         }         for (j = i-1; j>=high+1; j--)               arr[j+1] = arr[j];         arr[j+1] = temp;}


三、性能(算法时间、空间复杂度、稳定性)分析

折半查找只是减少了比较次数,但是元素的移动次数不变。折半插入排序平均时间复杂度为O(n^2);空间复杂度为O(1);是稳定的排序算法

           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_43667669/article/details/84069944