1.排序–>快速排序和冒泡排序
冒泡排序
/*冒泡排序*/
void show(int *,int);
void maopao(int *array,int size)
{
int i = 0,j = 0,tamp;
for(i = 0;i < size; i++)
{
for(j = 0;j < size; j++)
{
if( array[i] < array[j] )
{
tamp = array[i];
array[i] = array[j];
array[j] = tamp;
}
}
}
}
void show(int *s,int size)
{
int i=0;
for(i = 0;i < size; i++)
{
printf("%d ",s[i]);
}
printf("\n");
}
快速排序
int once(int *s,int i,int j);
void show(int *p,int size)
{
//printf("%d \n",p[0]);
int i = 0;
for(i = 0;i < size;i++)
{
printf("%d ",p[i]);
}
printf("\n");
}
void quick(int *s,int low,int hight)//hight is xiabiao
{
int mid = 0;
if(low < hight)
{
mid = once(s,low,hight);
show(s,11);
quick(s,low,mid-1);
quick(s,mid+1,hight);
}
}
int once(int *s,int i,int j)
{
int tmp = s[i];
while(i < j)
{
while(i < j && s[j] >= tmp)
j--;
if(i < j)
s[i] = s[j];
while(i < j && s[i] <= tmp)
i++;
if(i < j)
s[j] = s[i];
}
//printf("i=j:%d\n",i);
s[i] = tmp;
return i;
}
2.查找
顺序查找
int find(int *s,int size,int key)
{
int flag = 0;
for(int i=0;i < size;i++)
{
if(s[i] == key)
{
flag = 1;
printf("find:a[i] = %d\n",s[i]);
}
}
if(flag)
{
return 1;
}
else
{
printf("not find!\n");
return 0;
}
}
折半查找
//缺点只能找到第一个匹配的值
int find(int *s,int low,int hight,int key)
{
int mid = 0;
while(low < hight)
{
mid = (low + hight)/2;
if(s[mid] == key)
{
printf("find:a[%d] = %d\n",mid,s[mid]);
break;
}
else if(key < s[mid])
{
hight = mid-1;
}
else if(key > s[mid])
{
low = mid+1;
}
}
return 0;
}
哈希查找
如果要从11个数中查找数据
然后11/0.75=14,求得最大质数13
然后创建一个有13个元素的’指针数组’
然后将’11个数’分别对’13取余’
将每一个数保存在’余数’等于’数组元素下标’的链表中 //—需要链表
然后进行查找是直接找对应的数组下标即可
#include<stdio.h>
#include<stdlib.h>
#define N 13
#define ADDR_SIZE 8
typedef struct node{
int data;
struct node *next;
}hash;
hash **create_hash()
{
hash **h=(hash **)malloc(N * ADDR_SIZE);
for(int i = 0;i < N;i++)
{
h[i] = (struct node*)malloc(sizeof(struct node));
h[i]->next = NULL;
}
return h;
}
//插入数据
int insert(hash **h,int data)
{
int key = data%N;
struct node *p = h[key];
struct node *temp = (struct node*)malloc(sizeof(struct node));
//头插法
temp->data = data;
temp->next = p->next;
p->next = temp;
return 0;
}
//查找数据
int find(hash **h,int data)
{
int key = data % N;
struct node *p = h[key];
while(p->next != NULL)
{
if(p->next->data == data)
{
printf("find:p[%d] = %d\n",key,data);
return 1;
}
p=p->next;
}
return 0;
}
//遍历
int show_hash_table(struct node *head)
{
//如果链表后面没有数据,则用---0---表示链表存在但是没有数据
if (head->next == NULL)
{
puts("---0---");
return -1;
}
//遍历链表,打印数据
while(head->next != NULL)
{
head = head->next;
printf("%d ", head->data);
}
putchar(10);
return 0;
}
int main()
{
int a[11] = {100, 34, 14, 45, 46, 98, 68, 69, 7, 31, 26};
hash **h = create_hash();
int i=0;
int n;
for(i = 0;i < 11;i++)
{
insert(h,a[i]);
}
#if 1
//打印hash表--无实际意义
printf("-------这是hash表--------------------\n");
for (i = 0; i < N; i++)
{
show_hash_table(h[i]);//链表的遍历
}
printf("--------hash表结束--------------------\n");
printf("数组数据如下-->用于测试,无实质意义,遍历HASH表也是<---\n");
for(i = 0;i < 11;i ++)
{
printf("%d ",a[i]);
}
putchar(10);
#endif
printf("intput number-->:");
scanf("%d",&n);
if( !find(h,n) )
{
printf("not find!\n");
}
return 0;
}