您的位置:首页 > 其它

选择排序、直接插入排序、希尔排序

2013-06-27 15:11 369 查看
一、简单选择排序
简单选择排序(Simple Selection Sort)就是通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1≤i≤n)个记录交换。
1、code
/*对顺序表L作简单选择排序*/
Void SelectSort(SqList *L)
{
int i,j,min;
for(i=1;i<L->length;i++)
{
min=i;    /*将当前下标定义为最小值下标*/
for(j=i+1;j<=L->length;j++)
{
if(L->r[min]>L->r[i])
min=j;    /*注意,这里是和冒泡排序的初级版不同的地方,这里并没有交换数据,而是记录下标*/
/*带来的好处就是减少交换次数,和避免了冒泡排序初级版把小数据交换到L末尾*/
}
if(i!=min)
swap(L,i,min);
}
}


二、直接插入排序
直接插入排序(Straight Insertion Sort)的基本操作时将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。
1、code
/*对顺序表L作直接插入排序*/
void InsertSort(SqList *L)
{
int i,j;
for(i=2;i<=L->length;i++)
{
if(L->r[i]<L->r[i-1])
{
L->r[0]=L->r[i];    /*设置哨兵*/
for(j=i-1;L->r[j]>L->r[0];j--)    /*必须保证i-1前面的L是有序的*/
L->r[j+1]=L->r[j];    /*记录后移*/
L->r[j+1]=L->r[0];    /*插入到正确的位置*/
}
}
}

三、希尔排序
1、基本思想
先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
增量序列的最后一个增量必须等于1才行。
该方法实质上是一种分组插入方法,是直接插入排序的改进算法。
2、code
/*对序列表L作希尔排序*/
void ShellSort(SqList *L)
{
int i,j;
int increment=L->length;
do
{
increment =increment/3+1;    /*增量序列,保证增量序列的最后一个增量等于1*/
for(i=increment+1;i<=L->length;i++)
{
if(L->r[i]<L->r[i-increment])
{
L->r[0]=L->r[i];    /*暂存在L->r[0]中作为哨兵*/
for(j=i=increment;j>0 && L->r[0]<L->r[j];j-=increment)
L->r[j+increment]=L->r[j];    /*记录后移,查找插入位置*/
L->r[j+increment]=L->r[0];
}
}
}
while(increment>1)
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: