void insertsort(int a[], int n)
{
int i, j;
for (i = 1; i < n; i++)
{
if (a[i] < a[i - 1])
{
int temp = a[i];
for (j = i - 1; a[j] > temp; j--)
a[j + 1] = a[j];//依次后移
a[j+1] = temp;//因为for最后一次j--了,空的地方是j+1
}
}
}
直接插入排序首先是移动元素为了找到合适的插入位置,因此此时前面
元素已经有序,所以可以用折半查找来寻找插入位置
时间复杂度o(n^2),空间复杂度o(1)
void insertsort1(int a[], int n)
{
int i, j;
for (i = 1; i != n; i++)
{
int temp = a[i];
int low = 1, high = i - 1;//这之前的元素已经有序
while (low <= high)
{
int mid = (low + high) / 2;
if (a[mid] > a[i])high = mid - 1;//查找左半子表
else
low = mid + 1;//查找右半子表
//若相等 ,查找右半子表的结果是插入位置是high=low-1=mid也是查找到的位置
}//循环结束时high+1=low,新元素插入位置为high
for (j = i - 1; j >= /*high + 1*/low; --j)
a[j + 1] = a[j];
//a[high + 1] = temp;
a[low] = temp;
}
}
希尔排序<直接插入排序>
将待排序元素序列分割为若干个子序列(按相隔某个增量组成的)
然后分别进行直接插入排序,然后再缩减增量进行排序,待整个
序列基本有序后,再对整体元素进行一次直接插入排序
时间复杂度o(n^2),空间复杂度o(1)
void shellsort(int a[], int n)
{
int i, j, gap,temp;
for (gap = n / 2; gap > 0; gap /= 2)//gap是增量,从n/2开始缩减
for (i = gap; i != n; i++)
{
if (a[i] < a[i - gap])
{
temp = a[i];
for (j = i - gap; j >= 0 && a[j] > temp; j -= gap)//寻找每个小组插入位置
a[j + gap] = a[j];
a[j + gap] = temp;
}
}
}