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

一、简单选择排序

简单选择排序(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)
}

 

你可能感兴趣的:(选择排序,希尔排序,直接插入排序)