C语言-排序和查找

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;
}





  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值