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

news2024/11/17 11:25:30

一、概念

程序=数据结构+算法

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

K8S存储卷与PV,PVC

一、前言 Kubernetes&#xff08;K8s&#xff09;中的存储卷是用于在容器之间共享数据的一种机制。存储卷可以在多个Pod之间共享数据&#xff0c;并且可以保持数据的持久性&#xff0c;即使Pod被重新调度或者删除&#xff0c;数据也不会丢失。 Kubernetes支持多种类型的存储卷…

MyBatis 学习(二)之 第一个 MyBatis 案例

目录 1 配置 MyBatis 方式 1.1 XML 配置文件 1.2 Java 注解配置 1.3. Java API 配置 2 在 MySQL 中创建一张表 3 创建一个基于 Maven 的 JavaWeb 工程 4 编写 User 实体类 5 创建Mybatis全局配置文件 6 编写一个 DAO 或 Mapper 接口 7 编写 SQL 映射配置文件&#xf…

Vuepress的使用

介绍 将markdown静态资源转换成html。 动态资源的转换还有很多&#xff0c;为什么要使用Vuepress&#xff1f; 目录分析 项目配置 详情 具体配置请看文档 插件配置 vuepress-theme-vdoing 主题插件 npm install vuepress-theme-vdoing -D先安装依赖配置主题 使用vuep…

Android 架构MVI、MVVM、MVC、MVP

目录 一、MVC&#xff08;Model-View-Controller&#xff09; 二、 MVP&#xff08;Model-View-Presenter&#xff09; 三. MVVM&#xff08;Model-View-ViewModel&#xff09; 四. MVI&#xff08;Model-View-Intent&#xff09; 五.MVI简单实现 先简单了解一下MVC、MVP和…

5.WEB渗透测试-前置基础知识-常用的dos命令

内容参考于&#xff1a; 易锦网校会员专享课 上一篇内容&#xff1a;4.WEB渗透测试-前置基础知识-快速搭建渗透环境&#xff08;下&#xff09;-CSDN博客 常用的100个CMD指令 1.gpedit.msc—–组策略 2. sndrec32——-录音机 3. Nslookup——-IP地址侦测器 &#xff0c;是一个…

Keepalived 双机热备基础知识

7.1 Keepalived 双机热备基础知识 Keepalived起初是专门针对LVS设计的一款强大的辅助工具&#xff0c;主要用来提供故障切换(Failover) 和健康检查査(Health Checking)功能一一判断LVS 负载调度器、节点服务器的可用性&#xff0c;及时隔离并替 换为新的服务器&#xff0c;当故…

使用腾讯云go sdk 查询对象存储中最新文件

背景&#xff1a; 腾讯云账号下&#xff0c;有很多对象存储COS桶&#xff1a; 我现在想确认某一个对象存储桶的活跃程度&#xff0c;简单的来说。我想知道这个桶里面最后上传的一个文件是什么&#xff0c;以及它的上传时间戳。 本文将介绍如何使用腾讯云对象存储&#xff08;…

iMazing3安全吗?好不好用?值不值得下载

一、安全性 iMazing在设计和开发过程中&#xff0c;始终把用户数据的安全性放在首位。它采用了多种先进的安全技术来确保用户数据在传输、备份和存储过程中的安全。 iMazing3Mac-最新绿色安装包下载如下&#xff1a; https://wm.makeding.com/iclk/?zoneid49816 iMazing3Wi…

森林监测VR虚拟情景再现系统更便利

AI人工智能技术已经逐渐渗透到各个领域&#xff0c;为我们的生活带来了诸多便利。在虚拟仿真教学领域&#xff0c;AI技术的应用也日益丰富&#xff0c;为虚拟情景交互体验带来了前所未有的好处。 提高VR虚拟情景的逼真度 通过深度学习和计算机视觉等技术&#xff0c;AI/VR虚拟现…

java008 - Java方法

1、方法概述 1.1 概念 将独立功能的代码块组织成为一个整体&#xff0c;使其具有特殊功能的代码集。 1.2 注意事项 方法必须先创建才能使用&#xff0c;该过程称为方法的定义方法创建好不能直接运行&#xff0c;需要手动使用才执行&#xff0c;该过程称为方法的调用 2、方…

基于RISC-V架构的通信DSP的设计以及在5G RedCap基带中的应用(五)-基于RISC-V的RedCap DSP在5G基带中的应用

4 基于RISC-V的RedCap DSP在5G基带中的应用 4.1 基带处理器的关键任务和性能需求 基带处理器是移动通信设备中的关键部件&#xff0c;负责处理无线信号&#xff0c;包括信号的接收、发送和处理。在5G通信系统中&#xff0c;基带处理器的关键任务和性能需求包括以下几个方面&a…

【网站项目】424学报稿件管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

面试数据库篇(mysql)- 11主从同步

原理 MySQL主从复制的核心就是二进制日志 二进制日志&#xff08;BINLOG&#xff09;记录了所有的 DDL&#xff08;数据定义语言&#xff09;语句和 DML&#xff08;数据操纵语言&#xff09;语句&#xff0c;但不包括数据查询&#xff08;SELECT、SHOW&#xff09;语句。 复…

Vue 2 的核心模块和历史遗留问题以及vue3新特性

从下图你能看到&#xff0c;Vue 2 是一个响应式驱动的、内置虚拟 DOM、组件 化、用在浏览器开发&#xff0c;并且有一个运行时把这些模块很好地管理起来的框架。 vue 2 能把上面所说的这些模块很好地管理起来&#xff0c;看起来已经足够好了。不过事实真的如 此么&#xff1f;…

day01-HTML-CSS

一、Web 开发 1. 什么是 Web &#xff1f; Web&#xff1a;全球广域网&#xff0c;也称为万维网(www&#xff0c;World Wide Web)&#xff0c;能够通过浏览器访问的 网站。 2. Web 网站的开发模式 3. Web 标准 Web 标准也称为网页标准&#xff0c;由一系列的标准组成&#xff…

24计算机考研深大经验分享(计算机专业考研综合安排)

文章目录 背景科目选择高数选课一轮二轮冲刺阶段 线代一轮二轮 概率论计算机学科专业基础408数据结构计算机组成原理操作系统计算机网络总结 英语政治 末言 背景 首先贴一下初试成绩。这篇分享主要是给零基础的同学使用的&#xff0c;基础好的同学可以自行了解补充一下&#xf…

【论文阅读】微纳米气泡技术作为CO2-EOR和CO2地质储存技术的新方向:综述

Micro and nanobubbles technologies as a new horizon for CO2-EOR and CO2 geological storage techniques: A review 微纳米气泡技术作为CO2-EOR和CO2地质储存技术的新方向&#xff1a;综述 期刊信息&#xff1a;Fuel 2023 期刊级别&#xff1a;EI检索 SCI升级版工程技术1区…

力扣128. 最长连续序列(哈希表)

Problem: 128. 最长连续序列 文章目录 题目描述思路复杂度Code 题目描述 思路 1.先将数组中的元素存入到一个set集合中&#xff08;去除重复的元素&#xff09; 2.欲找出最长连续序列&#xff08;先定义两个int变量longestSequence和currentSequence用于记录最长连续序列和当前…

redis启动错误

错误&#xff1a; Creating Server TCP listening socket 127.0.0.1:6379: bind: No error redis-server.exe redis.windows.conf redis-cli.exe shutdown auth "yourpassword"

resilience4j 2.0.0版本使用要求最低JDK17(使用踩坑记录)

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容&#x1f4e2;文章总结&#x1f4e5;博主目标 &#x1f50a;博主介绍 &#x1f31f;我是廖志伟&#xff0c;一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作…