插入排序最好情况下是整个数的序列是有序的(因为不用进行数的移动),而希尔排序就是利用了这一点
1、当只有一个数时,不需要进行排序,有两个数时,只需要这两个数简单的进行比较,如果前边的大于后边的(默认升序排列),两者就互换位置即可,这样比较简单易懂,因此,刚
开始以两个数为一组,然后用数列长度除以2得到第一次进行希尔排序的步长,进行排序,然后步长依次递减。
2、当步长为1时,此时整个数列已经基本有序(此时已经接近于插入排序性能最优的情况)
代码:
#include<stdio.h>
void ShellInsert(int a[], int len,int delta)
{
int i;
int j;
for (i = 1+delta; i <= len; i++)
{
a[0] = a[i];
j = i-delta;
while (j >= 1 && a[0] < a[j])
{
a[j+delta] = a[j];
j -= delta;
}
a[j + delta] = a[0];
}
}
void ShellSort(int a[],int len,int delta[],int n)
{
int i;
for (i = 0; i < n; i++)
{
ShellInsert(a,len,delta[i]);
}
}
int main(void)
{
int i;
int a[11] = { 0, 34, 25, 76, 54, 14, 66, 21, 65, 38, 67 };
int delta[5] = { 5, 4, 3, 2, 1 };
ShellSort(a, 10, delta, 5);
for (i = 1; i <= 10; i++)
{
printf("%4d",a[i]);
}
printf("\n");
}
直接插入排序:
#include<stdio.h>
//升序
void InsSort(int a[], int len)
{
int i;
int j;
for (i = 2; i <= len; i++)
{
a[0] = a[i];
j = i;
while (a[0] < a[j - 1])
{
a[j] = a[j - 1];
j--;
}
a[j] = a[0];
}
}
#if 0
int main(void)
{
int a[] = { 0,2, 5, 6, 4 };
int i;
InsSort(a, 4);
for (i = 1; i <= 4; i++)
{
printf("%4d",a[i]);
}
printf("\n");
return 0;
}
#endif
折半插入排序:
#include<stdio.h>
//升序
void BinSort(int a[],int len)
{
int i;
int low, high;
int mid;
int j;
int key;
for (i = 2; i <= len; i++)
{
key = a[i];
low = 1;
high = i - 1;
while (low <= high)
{
mid = (low + high) / 2;
if (a[mid] > a[i])
{
high = mid - 1;
}
else
{
low = mid + 1;
}
}
for (j = i - 1; j >= low; j--)
{
a[j + 1] = a[j];
}
a[low] = key;
}
}
#if 0
int main(void)
{
int a[] = { 0, 2, 5, 6, 4 };
int i;
BinSort(a, 4);
for (i = 1; i <= 4; i++)
{
printf("%4d",a[i]);
}
printf("\n");
return 0;
}
#endif