日期:2014-05-16 浏览次数:20882 次
1.直接插入排序
原理:将数组分为无序区和有序区两个区,然后不断将无序区的第一个元素按大小顺序插入到有序区中去,最终将所有无序区元素都移动到有序区完成排序。
要点:设立哨兵,作为临时存储和判断数组边界之用。
实现:
[liul@test algorithms]$ more InsertSort.c
#include<stdio.h>
void InsertSort(int L[],int length)
{
int i,j,Tmp;
for(i=1;i<length;i++)
{
j=i+1;
if(L[j]<L[i])
{
Tmp=L[j];
while(L[0]<L[i])
{
L[i+1]=L[i];
i--;
}
L[i+1]=Tmp;
}
}
}
main()
{
int i,length=7;
int L[7]={4,7,6,9,8,7,9};
InsertSort(L,5);
for(i=0;i<length;i++)
{
printf("%d ",L[i]);
}
printf("\n");
}
[liul@test algorithms]$ gcc InsertSort.c -o InsertSort
[liul@test algorithms]$ ./InsertSort
4 6 7 7 8 9 92.希尔排序
原理:又称增量缩小排序。先将序列按增量划分为元素个数相同的若干组,使用直接插入排序法进行排序,然后不断缩小增量直至为1,最后使用直接插入排序完成排序。
要点:增量的选择以及排序最终以1为增量进行排序结束。
实现:
[liul@test algorithms]$ more ShellSort.c
#include<stdio.h>
void ShellSort(int L[],int length)
{
int i,j,Tmp,k=length-1;
while(k>0)
{
k/=2;
for(i=k;i<length;i++)
{
Tmp=L[i];
j=i-k;
while(j>=0 && Tmp<L[j])
{
L[j+k]=L[j];
j=j-k;
}
L[j+k]=Tmp;
}
}
}
int main()
{
int i,length=8;
int L[8]={4,7,6,9,8,7,9,2};
ShellSort(L,8);
for(i=0;i<length;i++)
{
printf("%d ",L[i]);
}
printf("\n");
}
[liul@test algorithms]$ gcc ShellSort.c -o ShellSort
[liul@test algorithms]$ ./ShellSort
2 4 6 7 7 8 9 9
[liul@test algorithms]$