希尔排序法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
排序过程举例
先取一个正整数 d1<n,把所有序号相隔 d1 的数组元素放一组,组内进行直接插 入排序;然后取 d2<d1,重复上述分组和排序操作;直至 di=1,即所有记录放进一个 组中排序为止
初始:d=5 49 38 65 97 76 13 27 49* 55 04 49 13 |-------------------| 38 27 |-------------------| 65 49* |-------------------| 97 55 |-------------------| 76 04 |-------------------| 一趟结果 13 27 49* 55 04 49 38 65 97 76 d=3
[编辑本段] C语言中的实现方法
功能
希尔排序
输入内容
数组名称(也就是数组首地址)、数组中元素个数
代码
例如对 503,17,512,908,170,897,275,653,462,154,509,612,677,765,7 03,94 排序的 C 语言算法如下:
void shell_sort(int *x, int n) { int h, j, k, t; for (h=n/2; h>0; h=h/2) /*控制增量*/ { for (j=h; j<n; j++) /*这个实际上就是上面的直接插入排序*/ { t = *(x+j); for (k=j-h; (k>=0 && t<*(x+k)); k-=h) { *(x+k+h) = *(x+k); } *(x+k+h) = t; } } } void main() { #define MAX 16 int *p, i, a[MAX]; /*录入测试数据*/ /* p = a; printf("Input %d number for sorting :\n",MAX); for (i=0; i<MAX; i++) { scanf("%d",p++); } *可以自己输入数据 */ a[] = {503,17,512,908,170,897,275,653,462,154,509,612,677,765,7 03,94}; printf("\n"); //503,17,512,908,170,897,275,653,462,154,509,612,677,765,703,9 4 /*测试排序*/
插入排序法
基本思想: 输入一个元素,插入到一个已经排好序的数列中的适当位置,使数列依然有序。 //例 1:输入一个数,插入一个各元素已经按照升序排列的数组中,插入后使数组中 元素仍然是按照升序排列的。思想:把欲插入的数与数组中各数逐个比较, 当找到 第一个比插入数大的元素 i 时,该元素之前即为插入位置。然后从数组最后一个元素 开始到该元素为止,逐个后移一个单元。最后把插入数赋予元素 a[i]即可。如果被插 入数比所有的元素值都小则插入最后位置。 #include"stdio.h" void main() { int m,i,j; int a[11]={2,6,7,9,13,16,19,21,25,29};//由于后面有插入 1 个元素的操作,故数 组长度定为 11(虽然数组中只有 10 个元素) scanf("%d",&m); for(i=0;i<10;i++) if(m<a[i]) { for(j=9;j>=i;j--) a[j+1]=a[j]; break; } a[i]=m; for(i=0;i<11;i++) printf("%d\t",a[i]); } //例 2:输入一个数,插入一个各元素已经按照降序排列的数组中,插入后使数 组中元素仍然是按照降序排列的。思想:把欲插入的数与数组中各数逐个比较, 当 找到第一个比插入数小的元素 i 时,该元素之前即为插入位置。然后从数组最后一个 元素开始到该元素为止,逐个后移一个单元。最后把插入数赋予元素 a[i]即可。如果 被插入数比所有的元素值都小则插入最后位置。 #include <stdio.h> void main() { int i,j,p,q,s,n; int a[11]={162,127,105,87,68,54,28,18,6,3}; printf("input number:\n"); scanf("%d",&n);
13 27 49* 55 04 49 38 65 97 76 13 55 38 76 |------------|------------|------------| 27 04 65 |------------|------------| 49* 49 97 |------------|------------| 二趟结果 13 04 49* 38 27 49 55 65 97 76 d=1 13 04 49* 38 27 49 55 65 97 76 |----|----|----|----|----|----|----|----|----| 三趟结果 04 13 27 38 49* 49 55 65 76 97 算法思想简单描述 在直接插入排序算法中,每次插入一个数,使有序序列只增加 1 个节点, 并且对插入下一个数没有提供任何帮助。如果比较相隔较远距离(称为 增量)的数,使得数移动时能跨过多个元素,则进行一次比较就可能消除 多个元素交换。D.L.shell 于 1959 年在以他名字命名的排序算法中实现 了这一思想。算法先将要排序的一组数按某个增量 d 分成若干组,每组中 记录的下标相差 d.对每组中全部元素进行排序,然后再用一个较小的增量 对它进行,在每组中再进行排序。当增量减到 1 时,整个要排序的数被分成 一组,排序完成。 下面的函数是一个希尔排序算法的一个实现,初次取序列的一半为增量, 以后每次减半,直到增量为 1。 希尔排序是不稳定的。
p = a; shell_sort(p,MAX); /**/ for (p=a, i=0; i<MAX; i++) { printf("%d ",*p++); } printf("\n"); system("pause"); } pascal 算法程序: program xepx; const n=7; type
for(i=0;i<10;i++) if(n>a[i]) { for(s=9;s>=i;s--) a[s+1]=a[s]; break; } a[i]=n; for(i=0;i<=10;i++) printf("%d ",a[i]); printf("\n"); }
希尔排序法
希尔排序法(缩小增量法) 属于插入类排序,是将整个无序列分割成若干小的子序列分 别进行插入排序的方法。
arr=array[1..n] of integer; var
a:arr; i,j,t,d:integer;
bool:boolean; begin write('input data:'); for i:=1to n do read(a[i]); writeln; d:=n; while d>1 do
begin d:=d div 2; forj:=d+1 ton do
begin t:=a[j]; i:=j-d; while(i>0) and (a[i]>t) do
begin a[i+d]:=a[i]; i:=i-d; end; a[百度文库+d]:=t; end;
end; write('output data:'); fori:=1ton dowrite(a:6); writeln; end.
相关文档
最新文档