哈希表(Hash table),也被称为散列表,是一种根据关键码值(Key value)而直接进行访问的数据结构。它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数被称为散列函数或哈希函数,而存放记录的数组则被称为散列表或哈希表。
#include "hash.h"
#include
#include
#include
HSNode_t *hashtable[HASH_SIZE] = {NULL};
int hash_function(char key) //哈希表函数
{
if (key >='a'&&key<='z')
{
return key - 'a';
}
else if(key >= 'A'&&key <= 'Z')
{
return key - 'A';
}
else
{
return HASH_SIZE-1;
}
}
int intsert_hashtable(HSDataType data)//向哈希表添加元素
{
int addr = hash_function(data.name[0]);
HSNode_t *pnode =(HSNode_t*)malloc(sizeof(HSNode_t));
if(pnode == NULL)
{
perror("malloc fail");
return 0;
}
pnode->data = data;
pnode -> pnext = NULL;
if(hashtable[addr] == NULL)
{
hashtable[addr] = pnode;
return 0;
}
pnode ->pnext = hashtable[addr]->pnext;
hashtable[addr]->pnext = pnode;
return 0;
}
HSNode_t *find_hashtable(char *name)//查找
{
int addr = hash_function(name[0]);
HSNode_t *p = hashtable[addr];
while(p != NULL)
{
if(!strncmp(p->data.name,name,strlen(name)))
{
break;
}
p = p->pnext;
}
return p;
}
void print_hashtable()//打印哈希表
{
int i = 0;
for( i = 0 ; idata.name,p->data.tel);
p = p->pnext;
}
}
return ;
}
void destroy_hashtable()//销毁哈希表
{
for (int i = 0;i < HASH_SIZE;++i)
{
while(hashtable[i] != NULL)
{
HSNode_t *p = hashtable[i];
hashtable[i] = p->pnext;
free (p);
}
}
}
第1次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后 再从剩余的元素中选择最小(或最大)的元素,然后放到已排序的序列的末尾。以此类推, 直到全部待排序的数据元素排完。
int main(void)
{
int a[] = {1,2,4,3,6,7,8,5,9,0};
int len = sizeof(a) / sizeof(a[0]);
int i,j;
for(i = 0;i < len -1;++i)
{
for(j = i + 1;j < len;++j)
{
if(a[i] > a[j])
{
int t;
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
}
是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增加1的有序表。在 整个排序过程中,我们反复地将一个记录插入到前面已排好序的序列中,直到全部记录插入 完成,排序也就结束了。
代码:
int main(void)
{
int a[] = {1,4,5,6,2,8,3,7,9,0};
int len = sizeof(a) / sizeof(a[0]);
int i;
for(i = 1; i< len;++i)
{
int j;
int t = a[i];
j = i;
while(j >0 && a[j - 1]>t)
{
a[j] = a[j - 1];
--j;
}
a[j] = t;
}
return 0;
}
通过重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过 来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
代码
int main(void)
{
int a[] = {1,4,5,6,2,8,3,7,9,0};
int len = sizeof(a) / sizeof(a[0]);
int i,j;
for(j = len - 1;j > 0;--j)
{
for(i = 0;i < j;++i)
{
if(a[i] > a[i + 1])
{
int t;
t = a[i];
a[i] = a[i + 1];
a[i + 1] = t;
}
}
}
return 0;
}
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分 的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以 递归进行,以此达到整个数据变成有序序列。
代码:
#include
void print_array(int *a,int len)
{
for(int i = 0;i < len ;++i)
{
printf("%d,",a[i]);
}
printf("\n");
}
void quick_sort(int *a,int begin ,int end)
{
int i = begin;
int j = end;
int key = a[i];
if(i > j)
{
return ;
}
while(i < j)
{
while(i= key)
{
--j;
}
a[i] = a[j];
while(i < j && a[i] <= key)
{
++i;
}
a[j] = a[i];
}
a[i] = key;
quick_sort(a,begin,i-1);
quick_sort(a,i+1,end);
}
int main(int argc, char *argv[])
{
int a[] = {1,-1,3,2,4,-5,6,-7,8,9};
int len = sizeof(a)/sizeof(a[0]);
quick_sort(a,0,len-1);
print_array(a,len);
return 0;
}