栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言排序和查找

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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:%dn",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] = %dn",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] = %dn",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
#include

#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] = %dn",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;
}





转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1011409.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号