希尔排序和哈希表

希尔排序(Shell’s method)又称为“缩小增量排序”(Diminishing Increment Sort)。
基本思想:先取一个小于n的整数d1并作为第一个增量,将文件的全部记录分成d1个组,所有距离为d1倍数的记录放在同一个组中,在各组内进行直接插入排序;然后取第二个增量d2<d1,重复上述的分组和排序,直至所取的增量dt=1(dt<…<d2<d1)为止,此时,所有的记录放在同一组中进行直接插入排序。

设待排序文件共有10个记录,其关键字分别为47, 33, 61, 82, 71, 11, 25, 47*, 57, 02,增量序列取值依次为5, 3, 1。排序过程如下:
第一趟 dk=5;11 ,25,47*,57,02,47,33,61,82,72
第二趟 dk=3;11 ,02,47*,33,25,47,57,61,82,72
第三趟 dk=1;02 ,11,25,33,47*,47,57,61,72,82

算法设计:如何设置监视哨?
设某一趟希尔排序的增量为h,则整个文件被分成h组:(R1, Rh+1, R2h+1, …), (R2, Rh+2, R2h+2, …), …,(Rh, R2h, R3h, …),因为各组中记录之间的距离均是h,故第1组至第h组的哨兵位置依次为1-h, 2-h, …, 0。
如果像直接插入排序算法那样,将待插入记录Ri(h+1≤i≤n)在查找插入位置之前保存到监视哨中,那么必须先计算Ri属于哪一组,才能决定使用哪个监视哨来保存Ri。为了避免这种计算,我们可以将Ri保存到另一个辅助记录x中,而将所有监视哨R1-h, R2-h, …, R0的关键字设置为小于文件中任何关键字即可。因为增量是变化的,所以各趟排序中所需的监视哨数目也不同,但是我们可以按最大增量d来设置监视哨。具体算法描述如下:

rectype R[n+d];     	/* R[0]~R[d-1]为d个监视哨 ,d=d[0] */
int d[t];       		/* d[0]~d[t-1]为增量序列 */
SHELLSORT(rectype R[ ], int d[ ])
{   int i, j, k, h;   	rectype temp; 
     int maxint=32767;       		     /* 机器中的最大整数 */
     for (i=0; i<d[0]; i++)  R[i].key= -maxint;   /* 设置哨兵 */
     k=0 ; 
    do {  	h=d[k];      		   /* 取本趟增量 */
      	for (i=d+h; i<n+d; i++)    /* R[h+d]~R[n+d-1]插入当前有序区 */
      	{  temp=R[i];      		/* 保存待插入记录 */
        	    j=i-h; 
       	    while (temp.key<R[j].key)     	/* 查找正确的插入位置 */
         	    {  R[j+h]=R[j];    	              /* 后移记录 */
       	        j=j-h;      		/* 得到前一记录位置 */
                   }
                   R[j+h]=temp;           	/* 插入R[i] */
     	}    	               	/* 本趟排序完成 */
      	k++; 
          } while (h!=1);     	/* 增量为1排序后终止算法 */
}   					/* SHELLSORT

哈希函数:用来定义记录的关键字与记录存储位置的对应关系的函数。其自变量是记录的关键字,函数值是记录存储位置。

哈希函数的构造方法
应解决两个问题:
1.哈希函数应是一个压缩映像函数,应具有较
大的压缩性以节省存储空间;
2.哈希函数应具有较好的散列性,以尽量减少
冲突的出现。

1.直接定址法:哈希函数为关键字的某个线性函数
2.平方取中法:取关键字平方后的中间几位为哈希地址
3.折叠法:将关键字分割成位数相同的几部分,然
后取叠加和(舍去进位)作为哈希地址。
4.除留余数法:H(key)= key MOD p。
5.数字分析法:使用该方法前应事先知道关键字的集
合,然后选取关键字的若干位来构成哈
希函数值。
6.随机算法:取关键字的随机函数为哈希地址,即H(key)=random(key)。

处理冲突的方法:
1.开放定址法:使用某种探查技术,在散列表中形成一个探查序列,当冲突发生时,沿此序列逐个单元查找空闲单元地址。
2.线性探查法
3.平方探查法
4.双散列函数探查法
5.链地址法:将所有关键字互为“同义词”的元素链接在一个线性链表中。此时的散列表以“指针数组”的形式出现, “同义词” 链表按哈希地址在“指针数组”中存储链表的头指针。

装填因子α
α是已存入元素与散列空间大小的比例
一般取值为0.6-0.9时产生冲突的可能性较小
例如,若有元素600个,则选取表长为667~1000较为合适。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值