码迷,mamicode.com
首页 > 编程语言 > 详细

二分插入排序

时间:2015-03-05 22:16:49      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:

二分插入排序算法

  一、基本思想:源自于二分查找,假设表中元素是按升序排列,将待插入的关键字与表中间位置记录的关键字与作比较。如果小于该关键字,则将元素插入后面的子表中,反之,如果大于该关键字,则将元素插入前面的子表中。反复迭代,直至所有关键字全部插入表中。

  

  技术分享

 

  二、C 语言代码:

  

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 //对 R[0...n-1] 递增有序进行直接插入排序
 5 void binaryInsertSort(RecType R[], int n)
 6 {
 7     int i;
 8     int j;
 9     int low;
10     int high;
11     int mid;
12     RecType tmp;
13     
14     for (i = 1; i < n; i++) {
15         tmp = R[i]; 
16         low = 0; 
17         high = i - 1; 
18         
19         //在 R[low...high] 中二分查找有序插入的位置
20         while (low <= high) {
21             mid = (low + high) / 2;
22             if (tmp.key < R[mid].key) {
23                 high = mid - 1; //左半区
24             } else {
25                 low = mid + 1; //右半区
26             }
27         }
28         
29         //记录向后移, high 意味着每次都是从右向左在有序区间进行比较 
30         for (j = i - 1; j >= high + 1; j--) {
31             R[j+1] = R[j];
32         } 
33         R[high+1] = tmp; //插入记录
34     }
35 } 

 

  三、算法分析

    时间复杂度:由算法代码可知,二分插入排序由两重循环组成,对于 n 个排序记录而言,外层必须经历 n-1 次循环,在每一趟排序寻找插入点的位置 low <= high 时的循环次数树 logi,其中 0 ≦ i ≦ n-1,而在记录移动的次数方面和直接插入排序是一样的,故对于二分插入排序而言:

      关键字比较和记录移动的最少次数是 (n-1)Σlogi,其中 0 ≦ i ≦ n-1,算法的时间复杂度为 O(n)。

      关键字比较和记录移动的最多次数为 (n-1)Σ(i+logi),其中 0 ≦ i ≦ n-1,算法的时间复杂度为 O(n²)。

      关键字平均比较和记录移动次数为 [(n-1)Σ(i+logi)]/2,其中 0 ≦ i ≦ n-1,算法的时间复杂度为 O(n²)。

 

  空间复杂度:由算法代码可知,所需的额外空间只有一个 tmp 变量,故直接插入排序算法空间复杂度为 O(1)。

 

  四、思考

    二分插入排序在经过一次遍历插入排序后,记录移动的次数与直接插入排序是否相同?

 
 
 
 
 
 

二分插入排序

标签:

原文地址:http://www.cnblogs.com/lishiyun19/p/4316736.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!