直接插入排序:
当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移如下图所示
当我们开始写插入排序时,可能感觉看懂了思想,但是写代码时却有种无从下手的感觉,这时我们不妨将插入排序进行分解首先我们先看成一个数据插入如下代码所示
如当前[0,end]区间内的数据有序时将end+1个数据插入[0,end]的区间内
int end;
int temp=a[end+1];
while(end>=0)
{
if(temp<a[end])
{
a[end+1]=a[end];
end--;
}
else
{
break;
}
}
a[end+1]=temp;
在看简单的将end看成一个序列插入1 2 3 …个数就是如下程序
for(int i=0;i<n-1;i--)//这里n代表排序数组的个数 i<n-1的原因是由于n个数只需要排序n-1次就可以成为有序数组
{
int end=i;
int temp=a[end+1];
while(end>=0)
{
if(temp<a[end])
{
a[end+1]=a[end];
end--;
}
else
{
break;
}
}
a[end+1]=temp;
}
希尔排序可以分成两步 :
1、预排序 是为了接近有序。
2、直接插入排序
预排序其实就是间距为gap的直接插入排序(gap为1)之后就是在进行直接插入排序如下图所示
void ShellSort(int* a, int n)
{
int gap = n;
int i = 0;
while (gap >1)
{
gap = gap / 3 + 1;
for (i = 0; i < n - gap; i++)
{
int end = i;
int temp = a[end + gap];
while (end >= 0)
{
if (temp < a[end])
{
a[end + gap] = a[end];
end -= gap;
}
else
{
break;
}
}
a[end + gap] = temp;
}
}
}