思路:将数放到桶内,先将桶内排序,再整体排序。用链表数组表示桶,
然后用(元素值 + k)/(k+1)来定位插入哪个桶里
k 个桶,最后一个桶用来放最大值,只有 k - 1 个跨度,这 k - 1 个跨度对应 k - 1 个桶。
数对应的桶的下标为 (元素值 + k)/(k+1)
1.遍历原始数组 arr 找到最大值和最小值,确定桶数 k
2.对桶内的数做排序
3.遍历所有的桶,输出结果
#include
#include
#include
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
typedef struct no
{
int data; //链表定义
no *pnext;
}node;
typedef struct
{
node head;
node tail; //构造头尾
}lht;
void link_init(lht larr[],int size)
{
int i=0;
while(i
{
larr[i].head.pnext=&larr[i].tail;//连接头尾
larr[i].tail.pnext=NULL;
i++;
}
}
void link_order(lht larr[],int l,int i)//链表排序
{
node *pt,*pf=NULL,*pm=NULL,*pl=NULL,*pn=NULL;
pn=(node *)malloc(sizeof(node));
if(pn==NULL)
exit(0);
pf=&larr[l].head;
pt=pf;
pm=pf->pnext;
pl=pm->pnext;
while( pm!=&larr[l].tail )
{
if(pm->data >i) //排序
{
pn->pnext=pm;
pf->pnext=pn;
pn->data=i;
printf("%d %d... ",l,i);
return ;
}
pt=pt->pnext;
pf=pt;
pm=pf->pnext;
pl=pm->pnext;
}
pf->pnext=pn;//*****当插入元素的值大于或小于链表里的任何元素时
pn->pnext=&larr[l].tail;//**********
pn->data=i;
return ;
}
void link_show(const lht larr[],int size)
{
int i=0;
node *pn=larr[i].head.pnext;
while(i
{
pn=larr[i].head.pnext;
while(pn!=&larr[i].tail)
{
printf("\n%d %d ",i,pn->data);
pn=pn->pnext;
}
i++;
}
}
int main(int argc, char *argv[])
{
int arr[13]={0,1,99,11,12,4,3,8,77,67,58,69,33};
lht larr[10]={0};//链表数组
link_init(larr,sizeof(arr)/sizeof(arr[0]));
int i=0;
while(i
{
link_order(larr,(arr[i]*sizeof(arr)/sizeof(arr[0])))/(99+1),arr[i]);
i++;
}
link_show(larr,sizeof(arr)/sizeof(arr[0]));
return 0;
}
上传的附件:
链表数组 hash.png
(66.77kb,1次下载)
链表数组.png
(315.79kb,0次下载)