Java版源程序来自:http://www.cnblogs.com/PerkinsZhu/p/5674572.html,在此感谢。
1 #include <iostream>
2 #include <vector>
3 #include <string>
4 using namespace std;
5
6 void printArray(string str,vector<int>& array){
7 cout<<str;
8 for(int val:array){
9 cout<<val<<" ";
10 }
11 cout<<endl;
12 }
13
14 void binaryInsertionSort(vector<int>& array) {
15 printArray("原数组:", array);
16 int time=0;
17 for (int i = 1; i < (int)array.size(); ++i) {
18 int temp = array[i];
19 int right = i - 1;
20 int left = 0;
21 int mid;
22 // 定位
23 while (left <= right) {
24 //mid = (left + right) / 2;
25 mid = left+(right-left)/2;
26 if (array[mid] > temp) {
27 right = mid - 1;
28 } else if (array[mid] < temp) {
29 left = mid + 1;
30 }
31 }
32 // 移动数组
33 for (int j = i; j > left; j--) {
34 array[j] = array[j - 1];
35 }
36 // 在找到的位置插入
37 array[left] = temp;
38 printArray("第" + to_string(++time) + "次循环排序结果: ", array);
39 }
40 }
41
42 int main()
43 {
44 vector<int> v={21,8,2,18,0,9,27,12,5,24};
45 binaryInsertionSort(v);
46 return 0;
47 }
运行结果:
原数组:21 8 2 18 0 9 27 12 5 24 第1次循环排序结果: 8 21 2 18 0 9 27 12 5 24 第2次循环排序结果: 2 8 21 18 0 9 27 12 5 24 第3次循环排序结果: 2 8 18 21 0 9 27 12 5 24 第4次循环排序结果: 0 2 8 18 21 9 27 12 5 24 第5次循环排序结果: 0 2 8 9 18 21 27 12 5 24 第6次循环排序结果: 0 2 8 9 18 21 27 12 5 24 第7次循环排序结果: 0 2 8 9 12 18 21 27 5 24 第8次循环排序结果: 0 2 5 8 9 12 18 21 27 24 第9次循环排序结果: 0 2 5 8 9 12 18 21 24 27
二分查找就是把插入位置的寻找过程由原来的顺序查找改成了二分查找,效率很高。