#include<stdio.h>
/*********************快速插入排序******************************/
void insert_sort(int *arr,int n){
int i,j; //循环变量
int temp; //临时变量
for(int i=1;i<n;i++){ //从前往后,遍历待排序序列
int temp=arr[i];
for(int j=i;j>0&&temp<arr[j-1];j--){
arr[j]=arr[j-1];
}
arr[j]=temp;
}
printf("排序成功\n");
}
#if 0
/********************定义选择排序函数**************************/
void select_sort(int *arr,int n){
for(int i=0;i<n;i++){ //控制待排序元素
int index=i; //将待排序的第一个当做最值
for(int j=i+1;j<n;j++){ //在待排序数组中遍历找到最值
if(arr[index]>arr[j]){
index=j; //此时找的是最小值---如果发现标记的最小值后后面有元素比他小,保存一下最小值的下标
}
}
if(index!=i){ //判断最值是否为待排序序列中的第一个
int t=arr[index];
arr[index]=arr[i];
arr[i]=t; //交换三部曲
}
}
printf("排序成功\n");
}
#endif
int main(int argc, const char *argv[])
{
int arr[]={10,52,96,87,14,25,36,95,14,78,10};
int len=sizeof(arr)/sizeof(arr[0]);
// select_sort(arr,len);
insert_sort(arr,len);
for(int i=0;i<len;i++){
printf("%d\t",arr[i]);
}
putchar(10);
return 0;
}
//定义结点的类型
typedef int datatype; //数据域
typedef struct Node{
datatype data; //数据域
struct Node *next; //指针域
}Node,*Nodepointer;
//初始化哈希表
void hash_init(Nodepointer hash[],int n);
//将元素放入哈希表中
void hash_insert(Nodepointer hash[],int n,int key);
//遍历哈希表
void hash_show(Nodepointer hash[],int n);
//哈希查找
int hash_search(Nodepointer hash[],int n,int key);
#endif
ubuntu@ubuntu:2022-9-19$ cat 11f.c
#include<stdio.h>
#include<stdlib.h>
#include"11.h"
//初始化哈希表
void hash_init(Nodepointer hash[],int n){
//n 表示的是哈希表的表长
//此处传过来了,指针数组的地址,利用for循环,对数组中的每一个元素进行初始化
//都是置位为空就行了,不然会出现野指针
for(int i=0;i<n;i++){
hash[i]=NULL;
}
printf("初始化哈希表成功\n");
}
//将元素放入哈希表中
void hash_insert(Nodepointer hash[],int n,int key){
//通过哈希函数将锁定的key 放在哈希表中的所在的位置
int pos=key%n; //key 所在的位置应该是hash[pos]这条链表
//申请结点封装数据
Nodepointer p=(Nodepointer)malloc(sizeof(Node));
if(NULL==p){
printf("空间申请失败\n");
return;
}
p->data=key;
p->next=NULL;
//此结点已经创建好,并且此结点的指针域已经指向空
//将封装的好的结点插入到hash[pos]----这条链表中
p->next=hash[pos];
hash[pos]=p;
//此处的hash[pos]相当于一个头指针
}
//遍历哈希表
void hash_show(Nodepointer hash[],int n){
for(int i=0;i<n;i++){
printf("%d:",i);
//定义遍历指针,遍历下标为i的链表
Nodepointer q=hash[i];
while(q!=NULL){
printf("%d->",q->data);
q=q->next;
}
printf("NULL\n");
}
}
//哈希查找
int hash_search(Nodepointer hash[],int n,int key){
//根据要查找的值确定所在的链表
//利用哈希函数确定链表所在的位置
int pos=key%n;
//定义遍历指针,从当前链表的第一个结点出发
Nodepointer q=hash[pos];
while(q!=NULL&&q->data!=key){
q=q->next;
}
//对q进行判断
if(NULL==q){
printf("您要找的元素不在表中\n");
return -1;
}else{
printf("查找成功,您要找的值在表中\n");
return 0;
}
}
#include"11.h"
int main(int argc, const char *argv[])
{
int arr[10]={3,5,18,55,67,22,35,29,40,88};
Nodepointer hash[13]; //定义哈希表
//在此定义了一个结构体类型的指针数组---数组中的每一个元素都是指针
//根据原来有10个元素计算可以求得,确定哈希表的长度为13
//调用初始化哈希表
hash_init(hash,13);
//将所有的元素放入到哈希表中
//此处的10个元素依次循环放入到哈希表中
//根据哈希函数,利用哈希表的长度为13
//然后分别放入到表中的不同的位置
for(int i=0;i<10;i++){
hash_insert(hash,13,arr[i]);
}
//调用遍历函数
hash_show(hash,13);
//调用哈希查找函数
hash_search(hash,13,22);
return 0;
}