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

一、概念

程序=数据结构+算法

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的百度网盘提取…

代码随想录算法训练营Day52 | 300.最长递增子序列、674.最长连续递增序列、718.最长重复子数组

300.最长递增子序列 这题的重点是DP数组的定义&#xff0c;子序列必须以nums[i]为最后一个元素&#xff0c;这样dp数组中后面的元素才能与前面的元素进行对比 1、DP数组定义&#xff1a;dp[i]表示以nums[i]为最后一个元素的最长递增子序列长度 2、DP数组初始化&#xff1a;全部…

Redis(5.0)

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

C++开发基础之简单的计时器也有适配场景

一、前言 计时器的开发通常涉及到计算时间间隔的方法和计算时间的方式。一般计时器的开发步骤&#xff1a; 获取起始时间点&#xff1a;在开始计时时&#xff0c;记录当前的时间戳作为起始时间点。 获取结束时间点&#xff1a;在结束计时时&#xff0c;记录当前的时间戳作为结…

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;而且底层空间需要用户自己管…

day.js和moment.js的区别

day.js 和 moment.js 都是非常流行的 JavaScript 日期处理库&#xff0c;它们都提供了丰富的 API 来处理日期和时间。以下是它们的一些主要区别&#xff1a; 大小&#xff1a;day.js 的大小只有 2KB&#xff0c;而 moment.js 的大小约为 60KB。如果你关心你的项目的大小&#x…

【前端】尚硅谷Webpack教程笔记

文章目录 1. 基本使用1.1 功能介绍1.2 开始使用 参考视频:尚硅谷Webpack5入门到原理 课件地址 【前端目录贴】 1. 基本使用 1.1 功能介绍 Webpack 是一个静态资源打包工具。 它会以一个或多个文件作为打包的入口&#xff0c;将我们整个项目所有文件编译组合成一个或多个文件输…

13. C++类使用方式

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

vscode中开发goalng,debug时遇到的tools报错问题

版本 vscode最新版本golang1.18.10dlv>1.8.3gopls0.16.0 > 0.14.2 1、vscode开发golang&#xff0c;delve dlv版本1.19高于golang版本 Failed to launch is too old for this version of Delve 1.0、前言 下载vscode之后&#xff0c;安装golang1.80.10的版本&#xf…

3月每日一题笔记

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

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

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

讲享元设计模式,顺便~学会了数据库连接池,

设计模式-详细说明享元模式设计&#xff0c;保准一听就会&#xff0c;不会你来打我 1.前言 今天呢&#xff0c;我们来说下享元模式&#xff0c;享元模式是结构型模式&#xff0c;我的感觉&#xff0c;结构型模式都是相对比较简单的设计模式&#xff0c;这个也是&#xff0c;之…

数据伪列

目录 数据伪列 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…