二分插入排序用于在插入排序中减少比较操作的位置,是插入排序的一个变种。
最坏时间复杂度 O(n^2)
- #include <stdio.h>
- void insert_sort(int a[], int num)
- {
- int i, j, k, temp, left, right, middle;
- for (i = 1; i < num; i++) {
- temp = a[i];
- left = 0;/*search for insert pos*/
- right = i - 1;
- while (left <= right) {
- middle = (left + right) / 2;
- if (temp > a[middle])
- left = middle + 1;
- else
- right = middle -1;
- }
- for (j = i - 1; j >= right; j--)
- a[j+1] = a[j];
- a[left] = temp;
- }
- }
- main()
- {
- int i, num;
- int a[] = {1,2,3,5,6,7,5};
- num = sizeof(a) / sizeof(int);
- insert_sort(a, num);
- for (i = 0; i < num; i++)
- printf("%d ", a[i]);
- printf("/n");
- }