插入排序就是把数列分成前面的已排序部分和后面的未排序部分,每次把未排序部分的第一个元素,插入到已排序部分,使得已排序部分仍然是有序的,长度加1。由此可见是稳定排序。由于从后往前查找且要移动元素,时间复杂度O(n^2)
由于前面的序列是有序的,可以采用折半查找的方式进行优化,这就是折半插入排序的思想了。
#include <iostream>
using namespace std;
void insertSort(int *data, int size) {
for(int i=1; i<size; i++) {
if(data[i] < data[i-1]) {
int tmp = data[i];
int j=i-1;
for(; j>=0 && data[j] > tmp; j--)
data[j+1] = data[j];
data[j+1] = tmp;
}
}
}
void binaryInsertSort(int* data, int size) {
for(int i=1; i<size; i++) {
int j;
int low, mid, high;
low=0;
high = i-1;
int tmp = data[i];
while (low <= high) {
mid = (low + high) / 2;
if(tmp > data[mid])
low = mid+1;
else
high=mid-1;
}
for(j=i-1; j>high; j--)
data[j+1] = data[j];
data[j+1] = tmp;
}
}
int main() {
int a[] = {57, 68, 59, 52, 72, 28, 96, 33, 24};
int size = sizeof(a) / sizeof(a[0]);
insertSort(a, size);
for(int i = 0; i < size; i++)
cout << a[i] << "\t";
return 0;
}