直接插入排序分为两段,一段是已排序的元素,一段是待排序的元素,当被排序元素的量十分巨大时,我们呢可以对有序的一段采用二分查找的思想找到待插入的位置,然后进行插入。
#include <iostream>
using namespace std;
void InsertSort(int arr[], int n);
int main() {
int arr[] = {16, 2, 1, 8, 1, 6, 56};
InsertSort(arr, 7);
for (auto i: arr)
cout << i << " ";
return 0;
}
void InsertSort(int arr[], int n) {
for (int i = 1; i < n; ++i) {
if (arr[i] < arr[i - 1]) {
/************二分查找插入位置**********/
int low = 0, high = i - 1, mid=(low+high)/2;
while (mid != high && mid != low) {
mid = (low + high) / 2;
if (arr[mid] < arr[i])
low = mid+1;
else
high = mid-1;
}
/*********************************/
//用于处理,mid指向的是插入位置的前一个元素,而不是后一个元素
if (arr[mid]<arr[i])
mid +=1;
int t = arr[i];
for (int j = i; j >= mid; --j) {
arr[j]=arr[j-1];
}
arr[mid]=t;
}
}
}