shell排序
来源:互联网 发布:不用充值约爱软件 编辑:程序博客网 时间:2024/05/17 18:13
希尔排序是一种插入排序算法,Shell排序又称作缩小增量排序。Shell排序的执行时间依赖于增量序列。
希尔排序的基本思想:先取一个小于n的整数d作为第一个增量,把文件的全部记录分成 d个组。所有距离为d的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2 < d重复上述的分组和排序,直至所取的增量 dk = 1 (dk < dk-l < …< d2 < d),即所有记录放在同一组中进行直接插入排序为止。
该方法实质上是一种分组插入方法。
#include <stdio.h>#include <stdlib.h>#define MAX_SIZE 100#define D 5typedef char InfoType;typedef struct Sz{ int key; InfoType *info;}Sz;typedef struct SQ//定义一个顺序线性表{ Sz *R; int length;}SqList;int Init_SqList(SqList *L)//顺序线性表初始化{ L->R=(Sz *)malloc((MAX_SIZE + 1) * sizeof(Sz)); if(!L->R) return 0; else { L->length = 0; return 1; }}
进行一趟希尔排序
/* 对顺序表L进行一趟希尔排序, 增量为d */void shell_pass(SqList *L, int d){ int j; int k; for(j = 1; j <= L->length; j++) { L->R[0] = L->R[j]; /* 设置监视哨兵 */ k = j + d; while((k > 0) && (L->R[0].key > L->R[k].key)) { L->R[j] = L->R[k]; L->R[k] = L->R[0]; } }}
一直循环到增量d为1为止
/*按增量序列dk[0 … t-1],对顺序表L进行希尔排序*/void shell_sort(SqList *L, int dk[], int t){ //dk是增量数组,t是dk的长度 int m; for(m = 0; m <= t; m++) shell_pass(L, dk[m]);//一直循环到增量d为1为止}
main方法
int main(){ int i; int num; int dk[D]; SqList L; Init_SqList(&L); for(i = D; i > 0; i--)//初始化增量数组 { dk[D - i] = i; } /*输入排序码*/ printf("please enter the number of the data:"); scanf("%d", &num); for(i = 1; i < num + 1; i++){ int values; printf("please enter the data:"); scanf("%d", &values); L.R[i].key = values; L.length++; } for(i = 1; i <= L.length; i++) { printf("%d ", L.R[i].key); } printf("\n"); printf("-----------------------------\n"); /*希尔排序*/ shell_sort(&L, dk, D); for(i = 1; i <= L.length; i++) { printf("%d ", L.R[i].key); } printf("\n"); return 0;}
例:
运行结果:
阅读全文