您的位置:首页 > 其它

插入排序(希尔排序、直接插入、折半插入排序)

2016-09-28 19:24 417 查看
希尔排序:(我自己的理解,刚开始进行算法学习,希望大家可以指点)

插入排序最好情况下是整个数的序列是有序的(因为不用进行数的移动),而希尔排序就是利用了这一点

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: