数据结构:排序算法+查找算法

一、概念

程序=数据结构+算法

1.算法的特性和要求

特性:

确定性(每次运行相同的输入都是同样的结果)、有穷性、输入、输出、可行性

设计要求:

正确性、高效率、低存储、健壮性、可读性

2.时间复杂度

3.常见排序算法的时间复杂度

冒泡排序:O(n^2)

选择排序:O(n^2)

快速排序:O(nlog2n)

直接插入排序:最坏情况O(n^2),最好情况O(n)

二、排序代码

1.冒泡排序

int len=sizeof(arr)/sizeof(arr[0]);
for(int i=1;i<len;i++)
{
    for(int j=0;j<len-i;j++)
    {
        if(arr[j]>arr[j+1])
        {
            temp = arr[j];
            arr[j] = arr[j+1];
            arr[j+1] = temp;        
        }    
    }
}

2.选择排序

已知min_index,长度len
for(int i=1;i<len;i++)
{
    min_index = i-1;  //假定最小值是待排序序列中的第一个元素
    for(int j=i;j<len;j++)
    {
        if(arr[min_index]>arr[j])
        {
            min_index = j;        
        }    
    }
    temp = arr[min_index];
    arr[min_index] = arr[i-1];
    arr[i-1] = temp;
}

3.快速排序

#include <stdio.h>
#include <string.h>
//定义一次快排的函数,返回最后基准的位置
int one_sort(int *arr,int low,int high){
	int base=arr[low];
	//只要high大于low说明没排好序
	while(low<high){
		while(low<high && arr[high]>=base){//当high>low并且high位置元素大于基准时high前移
			high--;
		}
		arr[low]=arr[high];//用high下标的元素覆盖掉low下标的元素

		//当high>low并且low下标元素小于base时,low后移
		while(low<high && arr[low]<=base){
			low++;
		}
		arr[high]=arr[low];
	}
	arr[low]=base;
	return low;
}
void sort(int *arr,int low,int high){
	//传过来的low<high说明无序
	if(low<high){
		int ret =one_sort(arr,low,high);//接收一次快排后中间位置(基准)
		sort(arr,low,ret-1);
		sort(arr,ret+1,high);
	}
}
int main(int argc, const char *argv[])
{
	int arr[]={12,90,78,23,1,10,56,11};
	int len=sizeof(arr)/sizeof(int);
	sort(arr,0,len-1);
	for(int i=0;i<len;i++){
		printf("%d ",arr[i]);
	}
	putchar(10);
	return 0;
}

4.直接插入排序

#include <stdio.h>
#include <string.h>

void insert_sort(int *arr,int len){
	int i,j,temp;
	//循环插入元素进入待排序序列中
	for(i=1;i<len;i++){  //从第二个元素开始
		temp=arr[i];  //把要插入的元素保存一下
		for(j=i;j>0 && temp<arr[j-1];j--){   //用前面的每一个元素与待插入的元素比较
			arr[j]=arr[j-1]; //把前面的元素后移
		}
		//退出了内层循环,说明找到了要插入的位置、

		arr[j]=temp;  //把要插入的元素插入
	}
}
int main(int argc, const char *argv[])
{
	int arr[]={12,90,78,23,1,10};
	int len=sizeof(arr)/sizeof(arr[1]);
	insert_sort(arr,len);
	for(int i=0;i<len;i++){
		printf("%d ",arr[i]);
	}
	putchar(10);
	return 0;
}

 三、查找算法代码

1.折半查找

折半查找的前提:对有序序列进行查找

#include <stdio.h>
#include <string.h>

int half_search(int *arr,int low,int high,int key){
	//如果传过来的最大值下标大于最小值的下标
	while(low<=high){
		//找中间值
		int mid=(low+high)/2;//得到中间值的下标;
		if(arr[mid]==key){
			printf("查找成功\n");
			return mid;
		}
		if(key<arr[mid])
			high=mid-1;
		else if(key>arr[mid])
			low=mid+1;
			
	}
return 0;
}
int main(int argc, const char *argv[])
{
	int arr[]={11,12,13,23,59,78,100};
	int len=sizeof(arr)/sizeof(arr[1]);
	printf("%d\n",half_search(arr,0,len-1,99));
	return 0;
}

2.哈希排序

哈希表的构造方法:

除留余数法:关键字对指定数据取模后,得到的就是关键字在哈希表中的下标

取模的数:关键字个数除3/4 ===>关键字个数*4/3 取最大质数

hash.c

#include "hash.h"

//创建结点的函数
node_p create_node(int data)
{
	node_p new=(node_p)malloc(sizeof(node));
	if(new==NULL){
		printf("申请失败\n");
		return NULL;
	}
	new->data=data;
	new->next=NULL;
	return new;
}
//存储函数
void save_hash(node_p hash[],int key)
{
	int base=key%MAX;//除留余数法
	node_p new=create_node(key);//申请新节点,把新节点存入哈希表
	//把新节点存入哈希表
	new->next=hash[base];
	hash[base]=new; //让结构体指针指向新节点
	//hash[base]中存的是第一个元素的地址
}
//打印函数
void show_hash(node_p hash[]){
	//循环结构体指针数组,即hash表
	for(int i=0;i<MAX;i++){
		//循环链表
		node_p p=hash[i];
		while(p!=NULL){
			printf("%d->",p->data);
			p=p->next;
		}
		printf("^\n");
	}
}
//查找
void search_hash(node_p hash[],int key){
	/*	//法一:
	//直接取到关键对13取模的结果
	int base=key%MAX;
	int i=1;
	//准备遍历整条链表
	node_p p=hash[base];
	//如果找到的关键字不符并且节点存在
	//	while(p->data!=NULL && p!=NULL){
	while(p!=NULL){
	if(p->data==key){
	printf("查找成功,数据在哈希表的%d位置\n",i);	
	break;
	}
	i++;
	p=p->next;
	}
	if(p==NULL)
	printf("查找失败\n");
	}
	*/
	//法二:
	int i;
	for(i=0;i<MAX;i++){
		node_p p=hash[i];
		while(p!=NULL){
			if(p->data==key){
				printf("查找成功\n");
				return;
			}
			p=p->next;
		}
	}
	if(i==MAX)
		printf("查找失败\n");
}

hash.h

#ifndef __HASH_H__
#define __HASH_H__
#include <stdio.h>
#include <stdlib.h>
#define MAX 13
typedef struct node{
	int data;
	struct node *next;
}node,*node_p;
//创建结点的函数
node_p create_node(int data);
//存储函数
void save_hash(node_p hash[],int key);
//打印函数
void show_hash(node_p hash[]);
//查找
void search_hash(node_p hash[],int key);

#endif

main.c

#include "hash.h"
int main(){
	int arr[]={25,51,8,22,26,67,11,16,54,41};
	int len=sizeof(arr)/sizeof(arr[1]);

	//申请一个结构体指针,里面存的是地址
	node_p hash[13]={0};//初始时指针都指向NULL
	for(int i=0;i<len;i++){
		save_hash(hash,arr[i]);
	}
	//show_hash(hash);
	search_hash(hash,11);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/424331.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

6.5 共享数据

本节介绍Android的四大组件之一ContentProvider的基本概念和常见用法&#xff1a;首先说明如何使用内容提供器封装内部数据的外部访问接口&#xff0c;然后阐述如何使用内容解析器通过外部接口操作内部数据&#xff0c;最后叙述如何利用内容解析器读写联系人信息&#xff0c;以…

SQL无列名注入

SQL无列名注入 ​ 前段时间&#xff0c;队里某位大佬发了一个关于sql注入无列名的文章&#xff0c;感觉好像很有用&#xff0c;特地研究下。 关于 information_schema 数据库&#xff1a; ​ 对于这一个库&#xff0c;我所知晓的内容并不多&#xff0c;并且之前总结SQL注入的…

2W字-35页PDF谈谈自己对QT某些知识点的理解

2W字-35页PDF谈谈自己对QT某些知识点的理解 前言与总结总体知识点的概况一些笔记的概况笔记阅读清单 前言与总结 最近&#xff0c;也在对自己以前做的项目做一个知识点的梳理&#xff0c;发现可能自己以前更多的是用某个控件&#xff0c;以及看官方手册&#xff0c;但是没有更…

EchoServer回显服务器简单测试

目录 工具介绍 工具使用 测试结果 工具介绍 github的一个开源项目,是一个测压工具 EZLippi/WebBench: Webbench是Radim Kolar在1997年写的一个在linux下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL&#xff0c;测试网站在压力下工作的…

【Vue3】解锁Vue3黑科技:探索接口、泛型和自定义类型的前端奇迹

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

WebServer -- 注册登录

目录 &#x1f349;整体内容 &#x1f33c;流程图 &#x1f382;载入数据库表 提取用户名和密码 &#x1f6a9;同步线程登录注册 补充解释 代码 &#x1f618;页面跳转 补充解释 代码 &#x1f349;整体内容 概述 TinyWebServer 中&#xff0c;使用数据库连接池实现…

vscode c/c++ 检测到 #include 错误。请更新 includePath。

问题背景 使用vscode打开项目后&#xff0c;头文件显示红色波浪线&#xff0c;没有引入。 检测到 #include 错误。请更新 includePath。已为此翻译单元(xxx)禁用波形曲线。 解决方法 gcc -v -E -x c - 显示所有头文件路径。 打开c_cpp_properties.json文件&#xff0c;粘贴…

Verilog Constructs、Verilog系统任务和功能

下表列出了Verilog构造在Vivado合成中的支持状态。 Verilog系统任务和功能 Vivado合成支持系统任务或功能&#xff0c;如下表所示。Vivado合成会忽略不支持的系统任务。 使用转换函数 使用以下语法对任何表达式调用$signed和$unsigned系统任务。 $signed&#xff08;expr&am…

「爬虫职海录」三镇爬虫

HI&#xff0c;朋友们好 「爬虫职海录」第三期更新啦&#xff01; 本栏目的内容方向会以爬虫相关的“岗位分析”和“职场访谈”为主&#xff0c;方便大家了解一下当下的市场行情。 本栏目持续更新&#xff0c;暂定收集国内主要城市的爬虫岗位相关招聘信息&#xff0c;有求职…

计算机设计大赛 深度学习机器视觉车道线识别与检测 -自动驾驶

文章目录 1 前言2 先上成果3 车道线4 问题抽象(建立模型)5 帧掩码(Frame Mask)6 车道检测的图像预处理7 图像阈值化8 霍夫线变换9 实现车道检测9.1 帧掩码创建9.2 图像预处理9.2.1 图像阈值化9.2.2 霍夫线变换 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分…

Redis、Elasticsearch(ES)、RocketMQ和MYSql 持久化对比

在现代大数据和分布式系统中&#xff0c;数据持久化是一个至关重要的话题。本文将针对 Redis、Elasticsearch&#xff08;ES&#xff09;、 RocketMQ和MYSql 这四种常见的数据存储和消息队列系统进行持久化方面的对比分析&#xff0c;帮助读者更好地了解它们各自的特点和适用场…

无人机镜头稳定的原理和相关算法

无人机的镜头稳定主要基于两个关键技术&#xff1a;镜头平衡技术和实时电子稳像。无人机镜头稳定的原理和相关算法主要是通过镜头平衡技术和实时电子稳像技术来保持摄像镜头的稳定性&#xff0c;从而拍摄出清晰、稳定的画面。无人机镜头稳定的原理主要是通过传感器和算法来实现…

第三百七十七回

文章目录 1. 概念介绍2. 实现方法2.1 maskFilter2.2 shader 3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在上一章回中介绍了"两种阴影效果"相关的内容&#xff0c;本章回中将介绍如何绘制阴影效果.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概…

FCIS 2023网络安全创新大会:洞察前沿技术,探索安全新境界(附大会核心PPT下载)

随着信息技术的飞速发展&#xff0c;网络安全问题日益凸显&#xff0c;成为全球关注的焦点。作为网络安全领域的重要盛会&#xff0c;FCIS 2023网络安全创新大会如期而至&#xff0c;汇聚了全球网络安全领域的顶尖专家、学者、企业家和政策制定者&#xff0c;共同探讨网络安全的…

【GitHub】修改默认分支

GitHub的默认分支为main&#xff0c;但我们常常习惯使用master作为默认分支&#xff0c;那在GitHub上如何将master修改为默认分支呢&#xff1f; 全局修改 点击头像&#xff0c;选择菜单栏中的设置 输入master作为默认分支&#xff0c;然后执行updating即可&#xff01; 单项…

【数据结构和算法初阶(C语言)】顺序表+单链表经典例题图文详解(题解大合集,搭配图文演示详解,一次吃饱吃好)

目录 1.移除链表元素 1.1思路1&#xff1a;遍历删除 1. 2 思路2&#xff1a;尾插法 2.反转链表 3.链表的中间节点 3.1解题思想及过程 3.2快慢指针思想解题---变式&#xff1a;返回链表的倒数第K个节点 4.合并两个有序链表 4.1解题思想 1取小的尾插 5.反转链表 6…

mindsdb,一个超酷的 Python 库!

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个超酷的 Python 库 - mindsdb。 Github地址&#xff1a;https://github.com/mindsdb/mindsdb 在机器学习领域&#xff0c;构建和训练模型是一项复杂且耗时的任务。为了简化这个过程&#xff0c…

【C语言】linux内核generic_xdp_tx

一、中文注释 /* 在执行通用XDP时&#xff0c;我们必须绕过qdisc层和网络挖掘点&#xff0c;* 以匹配驱动内XDP的行为。*/ void generic_xdp_tx(struct sk_buff *skb, struct bpf_prog *xdp_prog) {struct net_device *dev skb->dev; // 获取skb对应的网络设备struct netd…

Stable-Diffusion ubuntu服务器部署,报错解决方法(小白教程)

Stable Diffusion是一个深度学习模型&#xff0c;专注于生成高质量的图像。它由CompVis团队与Stability AI合作开发&#xff0c;并在2022年公开发布。这个模型使用文本提示&#xff08;text prompts&#xff09;生成详细、逼真的图像&#xff0c;是目前人工智能图像生成领域的一…

Java中使用Jsoup实现网页内容爬取与Html内容解析并使用EasyExcel实现导出为Excel文件

场景 Pythont通过request以及BeautifulSoup爬取几千条情话&#xff1a; Pythont通过request以及BeautifulSoup爬取几千条情话_爬取情话-CSDN博客 Node-RED中使用html节点爬取HTML网页资料之爬取Node-RED的最新版本&#xff1a; Node-RED中使用html节点爬取HTML网页资料之爬…