【2023.11.29练习】希尔排序的实现

题目描述:

本题要求实现一趟希尔排序函数,待排序列的长度1<=n<=1000。

函数接口定义:

void ShellInsert(SqList L,int dk);

其中L是待排序表,使排序后的数据从小到大排列。
###类型定义:

typedef  int  KeyType;
typedef  struct {                      
  KeyType *elem; /*elem[0]一般作哨兵或缓冲区*/                       
  int Length;      
}SqList;

裁判测试程序样例:

#include
#include
typedef  int  KeyType;
typedef  struct {                      
  KeyType *elem; /*elem[0]一般作哨兵或缓冲区*/                       
  int Length;      
}SqList;
void  CreatSqList(SqList *L);/*待排序列建立,由裁判实现,细节不表*/ 
void  ShellInsert(SqList L,int dk);
void  ShellSort(SqList L);

int main()
{
  SqList L;
  int i;
  CreatSqList(&L);
  ShellSort(L);
  for(i=1;i<=L.Length;i++)
   {        
     printf("%d ",L.elem[i]);
   }
  return 0;
}
void   ShellSort(SqList L)
{
  /*按增量序列dlta[0…t-1]对顺序表L作Shell排序,假设规定增量序列为5,3,1*/
   int k;
   int dlta[3]={5,3,1};
   int t=3;
   for(k=0;k

输入样例:

第一行整数表示参与排序的关键字个数。第二行是关键字值 例如:

10
5 2 4 1 8 9 10 12 3 6

输出样例:

输出由小到大的有序序列,每一个关键字之间由空格隔开,最后一个关键字后有一个空格。

1 2 3 4 5 6 8 9 10 12 

设计重点:

希尔排序的本质是逐渐缩小增量地对子数列进行插入排序。因此插入排序的掌握更为重要。

答案代码中的InserSort部分即为实现插入排序的函数。

最终代码:

void  ShellInsert(SqList L, int dk) {
    int i;
    int k[1001];
    k[0] = 0;

    for (i = 1; i <= dk; i++) {
        int j = 1;
        int p;
        for (p = i; p <= L.Length; p = p + dk)
        {
            k[j] = L.elem[p];
            j++;
        }
        InsertSort(k,j-1);
        j = 1;
        for (p = i; p <= L.Length; p = p + dk)
        {
            L.elem[p] = k[j];
            j++;
        }
    }
}

void InsertSort(int* temp, int lenth) {
    int i;
    int j;
    for (i = 2; i <= lenth; i++)//[k]为待插入数据
    {
        temp[0] = temp[i];
        for (j = i; j > 0; j--) {//从后向前找位置插入
            if (temp[j] < temp[j - 1]) {
                temp[j] = temp[j - 1];
                temp[j - 1] = temp[0];//比待插数大的数字后移
            }
            else {
                break;
            }
        }
        temp[0] = 0;
        /*for (int k = 1; k <= 10; k++) {
            printf(" %d", temp[k]);
        }
        printf("\n");*/

    }
}

总结:清楚希尔排序的基本实现逻辑,掌握直接插入排序。

你可能感兴趣的:(练习日志,学习,算法,数据结构)