1、从序列中,选中一个基准元素,经过一次快排把序列分为比基准大和比基准小两个部分,再依次对这两个部分进行快速排序,直到序列中只剩下一个元素,快排结束
#include<stdio.h>
//单次快排
int one_sert(int *arr,int low,int high)
{
int base=arr[low];
while(high>low)
{
while(high>low&&arr[high]>base)
{
high--;
}
arr[low]=arr[high];
while(high>low&&arr[low]<base)
{
low++;
}
arr[high]=arr[low];
}
arr[low]=base;
return low;
}
//整体快排
void sort(int *arr,int low,int high)
{
int ret =one_sert(arr,0,high);
one_sert(arr,0,ret-1);
one_sert(arr,ret+1,high);
}int main(int argc, char *argv[])
{
int arr[]={34,78,56,90,12,100,23,76};
int len=sizeof(arr)/sizeof(arr[0]);
sort(arr,0,len-1);
for(int i=0;i<len;i++)
{
printf("%d\n",arr[i]);
}
return 0;
}
2、折半查找的前提:对于有序序列的查找
思想:每次找序列的中间位置,如果找到的数比关键字小,就向大的一端进行查找,如果找到的比关键字大,就向小的一端查找
#include<stdio.h>
int half_search(int *arr,int low,int high,int key)
{
while(high>=low)
{
int mid =(low+high)/2;
if(arr[mid]==key)
{
return mid;
}
else if(arr[mid]>key)
{
high=mid-1;
}
else if(arr[mid]<key)
{
low=mid+1;
}
}
return -1;
}int main(int argc, char *argv[])
{
int arr[]={12,34,56,77,86,90};
int len=sizeof(arr)/sizeof(arr[0]);
printf("%d\n",half_search(arr,0,len-1,100));
return 0;
}
3、 哈希表是一张顺序存储的数据的查找表
常用的构造哈希函数的方式:除留余数法(哈希表的表长如何确定:序列中元素的个数除,3/4取最大质数)处理哈希冲突,使用链地址法:
符合相同特征的关键字,通过指针都存在哈希表中的相同位置。(链表)
#include "hax.h"
//申请结点的函数
node_p create_node(int data)
{
node_p new = (node_p)malloc(sizeof(node));
new->data = data;
return new;
}
//1、存入哈希表
void insert(node_p H[],int key)
{
//数据要存入哈希表中指定下标的位置
int i = key%MAX;
//申请结点
node_p new = create_node(key);
//头插
new->next = H[i];
H[i] = new;
}
//2、输出哈希表
void show(node_p *H)
{
//1、入参为空判断
//循环哈希表(指针数组)
for(int i=0;i<MAX;i++)
{
//输出指针数组指向的链表
node_p p = H[i];
while(p!=NULL)
{
printf("%d->",p->data);
p=p->next;
}
printf("NULL\n");
}
}
//3、查找元素
int hax_search(node_p H[],int key)
{
for(int i=0;i<MAX;i++)
{
if(H[i]->data==key)
{
return i;
}
else if(H[i]->next->data==key)
{
return i;
}
}
return -1;
}
4、
4、思维导图