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