数据结构:排序算法与哈希表

目录

排序

稳定性

[1. 插入](#1. 插入)

思想

实现

2、快排

快排

实现

hash表

应用

hash函数

设计的要点

常见hash函数设计

hash冲突

冲突的解决

实现


排序

使一个序列按照一定的次序(升序)进行排布。

稳定性

假如在一个序列中,有两个等值数据,记作 ki, kj; 在排序前, i<j, (i,j 都是数组中的下标) 。排序后依然保持 ki 的存储位置在kj的前面,称为稳定的排序。否则 是不稳定的排序方式。

1. 插入

思想

插入

  1. 把待插入元素,放入已有的序列当中

  2. 把待插入元素,和有序序列中,最后一个数字进行比较,

3 如果 待插入元素大, 位置不需要变化的

4.反之,在有序序列中,比待插入元素都大数字,都整体后移。

实现

// arr,需要排序的数列

// len,数列的个数

void insert_order(int *arr, int len)

{

int i, j, k;

// i指向待插入元素的下标

for (i = 1; i < len; i++)

{

// k存放待插元素本身

k = arri;

j = i - 1; //有序序列的最后一个元素

while (j >= 0 && arrj > k)

{

arrj + 1 = arrj;

j--;}

arrj + 1 = k;

}

}

2、快排

快排

分而治之

1.确定中枢(数组中第一个,假想中枢数字),

2.拿中枢和最后面的比较,

中枢小,j-- 。反之, ai = aj

  1. 拿中枢和最前面的比较

中枢大, i++. 反之,aj = ai

4.i<j ,重复3,4步。反之,i == j ,ai = 中枢

5.递归 sort(a,0,i-1);

6.递归 sort(a,i+1,len);

实现

void quick_sort(int *arr, int left, int right)

{

int i, j, k;

i = left;

j = right;

k = arri; //假象的中间值。

while (i < j) // i == j

{

while (k <= arrj && i < j) j--;

if (i < j)

arri = arrj;

while (k >= arri && i < j) i++;

if (i < j)

arrj = arri;

}

arri = k;

if (left < i - 1)

quick_sort(arr, left, i - 1);

if (right > i + 1)

quick_sort(arr, i + 1, right);

}

hash表

一种既可以存储也可以查询的技术。

一般使用顺序表实现,需要支持随机访问数据。

应用

希望在大量数据中,快速o(1),o(logn)找到需要的数据。

存储位置=f(key)

存储位置就是数组中需要存储数据的地址。

f ,hash函数,根据需要存储内容可以计算出下标的函数

key,就是需要要存储的数据

hash函数

设计的要点
  • 计算相对简单
  • 地址分布均匀
常见hash函数设计

直接定值法

平方取中法

折叠法

求余法

hash冲突

f(key1) ==f(key2), key1!= key2 ; 需要存储的数据不同,但是调用了hash函数后,下标相同。 被称为hash函数冲突

冲突的解决

1、线性探测:尝试测试 =1,+2,+3,+4,+5..........+n n<数组的容量

2、二次探测:尝试测试+1,-1,+2,-2,+3,-3,+4,-4.........=i^2 i^2<n 数组的容量

3、随机法:尝试测试 +rand()%size

实现

typedef int DATATYPE;

typedef struct

{

DATATYPE* head;

int tlen;

}HsTable;

HsTable* CreateHsTable(int len)

{

HsTable* hs = malloc(sizeof(HsTable));

if(NULL == hs)

{

printf("CreateHsTable malloc1 error\n");

return NULL;

}

hs->head = malloc(sizeof(DATATYPE)*len);

if(NULL == hs->head)

{

printf("CreateHsTable malloc2 error\n");

return NULL;

}

hs->tlen = len;

for(int i = 0 ;i<len;i++)

{

hs->headi=-1;

}

return hs;

}

int HsFun(HsTable*hs,DATATYPE*data)

{

return *data%hs->tlen;

}

int HsTableInsert(HsTable*hs,DATATYPE*data)

{

int inx = HsFun(hs,data);

while(hs->headinx!=-1)

{

printf("冲突 data:%d pos%d\n",*data,inx);

inx= (inx+ 1)%hs->tlen;

}

hs->headinx = *data;

return 0;

}

int HsTableSearch(HsTable*hs,DATATYPE*data)

{

int inx = HsFun(hs, data);

int old_inx = inx;

while(hs->headinx!= *data)

{

inx= (inx+ 1)%hs->tlen;

if(inx == old_inx)

{

return -1;

}

}

return inx;

}

int main(int argc, char **argv)

{

HsTable* hs = CreateHsTable(10);

int a10={31,22,75,34,12,11,44,67,90,3};

for(int i = 0 ;i<10;i++)

{

HsTableInsert(hs, &ai);

}

int want_num =75;

int ret = HsTableSearch(hs, &want_num);

if(-1 == ret)

{

printf("can't find\n");

}

else

{

printf("find it\n");

}

return 0;

}

相关推荐
shirsl1 小时前
算法 Day1-数组 / 哈希 + 双指针
python·算法·哈希算法
2601_967760788 小时前
2026年PDF压缩与页码添加工具技术实测:性能、算法与本地化适配深度对比
算法·pdf
不会就选b9 小时前
算法日常・每日刷题--<贪心>7
数据结构·算法·leetcode
moonrailgun9 小时前
用 Node.js 复刻 Codex Astra 的终端星光
前端·javascript·算法
罗西的思考10 小时前
[Agent Memory / 强化学习] MemPO源码学习笔记 ---(1)--- 总体
人工智能·算法·机器学习
lvwangshu11 小时前
图论:LCA、树的直径、树的重心、二分图与 Tarjan 缩点
算法·图论
爱吃苹果的日记本11 小时前
数据结构第一课
c语言·数据结构·数据库·学习·c#
张小姐的猫11 小时前
【AI大模型接入SDK】 —— Gemini接入封装
android·数据结构·数据库·c++·人工智能·python
302wanger11 小时前
干与湿:AI 拿走脑力之后,人剩下什么
算法
计算机编程-吉哥12 小时前
脑肿瘤MRI智能识别系统:基于深度学习的像素级脑肿瘤语义分割平台【计算机毕业设计选题推荐】
人工智能·python·深度学习·算法·毕业设计·课程设计·大数据毕业设计选题推荐