插入排序:
在一组数据中,分为有序区和无序区,有序区初始为该组数据的第一个元素,然后对无序区的第一个元素开始,不断与有序区中的元素比较,移动元素,插入元素,直到无序区中所有元素都放到有序区中。
时间复杂度O(n²) 空间复杂度O(1) 稳定
void InsertSort(RecType R[], int n)
{
int i, j;
RecType tmp;
for(i = 1; i< n; i++){
tmp = R[i];
j = i - 1;
while( j>= 0&&tmp < R[j] ){
R[j+1] = R[j];
j--;
}
R[j+1] = tmp;
}
}
折半插入排序:
在一组数据中,分为有序区和无序区,有序区初始为该数据的第一个元素,从无序区的第一个元素开始,重复找到有序区的中间位置,将无序区的第一个元素与中间位置比较,找到插入的位置后,移动元素,直到无序区中的所有元素都放在有序区中。
void InsertSort(int R[], int n)
{
int i, j, low, high, mid;
int tmp;
for (i = 1; i < n; i++) {
tmp = R[i]; //将R[i]保存到tmp中
low = 0; high = i - 1;
while (low <= high) { //在R[low..high]中折半查找有序插入的位置
mid = (low + high) / 2; //取中间位置
if (tmp < R[mid])
high = mid - 1; //插入点在左半区
else
low = mid + 1; //插入点在右半区
}
for (j = i - 1; j >= high + 1; j--) //元素后移
R[j + 1] = R[j];
R[high + 1] = tmp; //插入元素
}
}