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

一、概念

程序=数据结构+算法

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};//初始时指针都指向NULLfor(int i=0;i<len;i++){save_hash(hash,arr[i]);}//show_hash(hash);search_hash(hash,11);
}

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

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

相关文章

LeNet训练集详细实现

一、下载训练集 导包 import torch import torchvision import torch.nn as nn from model import LeNet import torch.optim as optim import torchvision.transforms as transforms import matplotlib.pyplot as plt import numpy as npToTensor()函数&#xff1a; 把图像…

视频二维码加密怎么设置?验证密码看内容的二维码做法

现在为了保障内容的私密性&#xff0c;很多人会采用生成二维码的方式来展现或者传递自己的内容&#xff0c;比如文件、视频、音频等等。如果我们想要制作一个视频二维码&#xff0c;并且给二维码加密后需要输入正确密码才能查看视频内容&#xff0c;这种类型的二维码的制作方式…

就业班 2401--3.5 Linux Day11--DNS解析

DNS域名解析服务 少壮不努力&#xff0c;老大徒伤悲。一、 1.DNS介绍 DNS 是域名系统 (Domain Name System) 的缩写&#xff0c;是因特网的一项核心服务&#xff0c;它作为可以将域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使人更方便的访问互联网&#xff0c;…

numpy——基础知识(创建/类型/形状/运算)(python)

简介 NumPy 是一个 Python 包。它代表 Numeric Python。 它是一个由多维数组对象和用于处理数组的例程集合组成的库。 Numeric&#xff0c;即 NumPy 的前身&#xff0c;是由 Jim Hugunin 开发的。 也开发了另一个包 Numarray &#xff0c;它拥有一些额外的功能。 2005年&#…

VueCli的安装与卸载

文章目录 一.Node安装包的报读网盘提取码二、Vue脚手架Cli三、Vue-CLI使用步骤(自定义安装)1.转换路径并创建项目2.创建步骤的解释(保姆级)3.等待vue项目自己创建好(保姆级) 四、通过npm对vue的安装与卸载 一.Node安装包的报读网盘提取码 下面的链接为地址: Node的百度网盘提取…

Redis(5.0)

1、什么是Redis Redis是一种开源的、基于内存、支持持久化的高性能Key-Value的NoSQL数据库&#xff0c;它同时也提供了多种数据结构来满足不同场景下的数据存储需求。 2、安装Redis&#xff08;Linux&#xff09; 2.1、去官网&#xff08;http://www.redis.cn/&#xff09;下…

linux安装ngnix

一、将nginx-1.20.1.tar.gz上传至linux服务器目录下 二、将nginx安装包解压到/usr/local目录下 tar -zxvf /home/local/nginx-1.20.1.tar.gz -C /usr/local/三、预先安装依赖 yum -y install pcre-devel yum -y install openssl openssl-devel yum -y install gcc gcc-c auto…

二分查找算法:高效搜索有序数据的利器

二分查找算法&#xff1a;高效搜索有序数据的利器 在计算机科学中&#xff0c;搜索是一项基本而重要的操作。对于有序数据&#xff0c;二分查找算法是一种高效的搜索方法。本文将介绍二分查找算法的原理、实现以及其在实际应用中的优势&#xff0c;帮助读者理解和应用这一常用的…

C++学习第七天(string类)

1、学习string的原因&#xff1f; C语言中的字符串 C语言中&#xff0c;字符串是以‘\0’结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;而且底层空间需要用户自己管…

13. C++类使用方式

【类】 C语言使用函数将程序代码模块化&#xff0c;C通过类将代码进一步模块化&#xff0c;类用于将实现一种功能的全局数据、以及操作这些数据的函数集中存储在一起&#xff0c;同时可以设置类成员的访问权限&#xff0c;禁止外部代码使用和篡改本类成员&#xff0c;类成员访…

3月每日一题笔记

感谢我的好朋友的鼓励 3月4日 两种等价方式?都是错误的 ->加减中不能使用等价无穷小? ->不全面。 两项无穷小相减, 那么两项无穷小比值的极限不等于 1 时, 或者两项无穷小相加时, 其比值极限不等于 −1 时, 代数和差各项可以用等价无穷小替换 等价无穷小不精确

腾达路由器检测环境功能破解MISP基础

在虚拟机上用qemu运行腾达路由器的网站固件会遇到无法识别网络的问题&#xff0c;这篇主要是破解这个功能&#xff0c;使腾达路由器成功在虚拟机上运行&#xff0c;方便漏洞复现 本次用到的腾达路由器版本&#xff1a; https://www.tenda.com.cn/download/detail-3683.html下…

数据伪列

目录 数据伪列 rownum 查询 emp 表中的记录并且取得第一行数据 取得 emp 表的前 5 行记录 rowid 面试题&#xff1a;表中有许多完全重复的数据&#xff0c;要求将重复的数据删除掉&#xff08;只剩最早的一个&#xff09; Oracle从入门到总裁:https://blog.csdn.net/weixin…

Guava处理异常

guava由Google开发&#xff0c;它提供了大量的核心Java库&#xff0c;例如&#xff1a;集合、缓存、原生类型支持、并发库、通用注解、字符串处理和I/O操作等。 异常处理 传统的Java异常处理通常包括try-catch-finally块和throws关键字。 遇到FileNotFoundException或IOExce…

嵌入式蓝桥杯做题总结

第十二届省赛 按键代码 ——自认为比较巧妙&#xff0c;定时器3被设置为10ms进入一次中断&#xff0c;代替了HAL_Delay(10)的方法消抖&#xff1b; 运用状态机机思想实现检测多个按键检测——且分为两个状态&#xff0c;其中一个状态PB&#xff11;和PB&#xff12;的按键不…

stable-diffusion-webui-forge 介绍,安装,运行

一 stable-diffusion-webui-forge 介绍 stable-diffusion-webui-forge 的作用和stable-diffusion-webui一样&#xff0c;但性能上作了优化&#xff0c;说得上是是stable-diffusion-webui优化版&#xff0c;本人在使用stable-diffusion-webui时偶尔会有内存不够报错。本人的环境…

手写分布式配置中心(四)增加实时刷新功能(长轮询)

上一篇文章中实现了短轮询&#xff0c;不过短轮询的弊端也很明显&#xff0c;如果请求的频率较高&#xff0c;那么就会导致服务端压力大&#xff08;并发高&#xff09;&#xff1b;如果请求的频率放低&#xff0c;那么客户端感知变更的及时性就会降低。所以我们来看另一种轮询…

Mysql面试总结

基础 1. 数据库的三范式是什么&#xff1f; 第一范式&#xff1a;强调的是列的原子性&#xff0c;即数据库表的每一列都是不可分割的原子数据项。第二范式&#xff1a;要求实体的属性完全依赖于主关键字。所谓完全 依赖是指不能存在仅依赖主关键字一部分的属性。第三范式&…

UDP通信发送和接收 || UDP实现全双工通信

recvfrom ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen); 功能: 从套接字中接收数据 参数: sockfd:套接字文件描述符 buf:存放数据空间首地址 …

基于springboot实现的幼儿园管理系统

一、系统架构 前端&#xff1a;html | layui | jquery | css 后端&#xff1a;springboot | mybatis 环境&#xff1a;jdk1.8 | mysql | maven 二、代码及数据库 三、功能介绍 01. 登录页 02. 系统管理-用户管理 03. 系统管理-页面管理 04. 系统管理-角色管…