数据结构:查找与排序

注:以下代码均为C++

查找

一、线性表的查找

1. 顺序查找

int search_seq(vector<int> s, int key){for(int i = 0; i < s.size(); i++){if(s[i] == key)return i;}return -1;
}

2. 折半查找

(1)非递归:循环

int search_bin1(vector<int> s, int key){int low = 0, high = s.size()-1, mid;while(low <= high){mid = (low + high) / 2;if(key == s[mid])return mid;else if(key < s[mid])high = mid - 1;elselow = mid + 1;}return -1;
}

(2)递归

int search_bin2(vector<int> s, int key, int low, int high){if(low > high)  return -1;int mid = (low + high)/2;if(key == s[mid])return mid;else if(key < s[mid])return search_bin2(s, key, low, mid-1);elsereturn search_bin2(s, key, mid+1, high);
}
int search_bin(vector<int> s, int key){int ans = search_bin2(s, key, 0, s.size()-1);return ans;
}

二、树表的查找

struct BSTree{int data;struct BSTree* lchild, *rchild;
};

1. 二叉排序树的查找

(1)非递归:循环

BSTree* searchBST1(BSTree* T, int key){if(T == NULL)   return NULL;while(T != NULL){if(key == T->data)return T;else if(key < T->data)T = T->lchild;elseT = T->rchild;}
}

(2)递归

BSTree* searchBST2(BSTree* T, int key){if(T == NULL)   return NULL;if(key == T->data)return T;else if(key < T->data)return searchBST2(T->lchild, key);elsereturn searchBST2(T->rchild, key);
}

排序

一、插入排序(从小到大排序)

1. 直接插入排序

void insertSort(vector<int>& s){if(s.size() <= 1)   return;for(int i = 1; i < s.size(); i++){if(s[i] < s[i-1]){  //待插入的元素为s[i],若待插入元素比已排好序列的最后一位小,则开始插入排序,否则不用动它。int temp = s[i];  //暂存单元int j;for(j = i-1; j >=0 && temp < s[j]; j--){  //找到插入位置s[j+1] = s[j];}s[j+1] = temp;  //插入元素}}
}

2. 折半插入排序

void BinsertSort(vector<int>& s){if(s.size() <= 1)   return;int i, j, low, high, mid;for(i = 1; i < s.size(); i++){int temp = s[i];  //暂存单元//查找插入位置low = 0, high = i-1;while(low <= high){mid = (low + high)/2;if(temp < s[mid]){high = mid - 1;}elselow = mid + 1;}//移动元素for(j = i-1; j >= high+1; j--)s[j+1] = s[j];//插入正确位置s[high+1] = temp;}
}

3. 希尔排序:缩小增量的多遍插入排序,每个子表是直接插入排序

void shellInsert(vector<int>& s, int dk){if(s.size() <= 1)   return;for(int i = dk; i < s.size(); i++){if(s[i] < s[i-dk]){  //待插入的元素为s[i],若待插入元素比已排好序列的最后一位小,则开始插入排序,否则不用动它。int temp = s[i];  //暂存单元int j;for(j = i - dk; j >= 0 && temp < s[j]; j = j - dk){  //找到插入位置s[j+dk] = s[j];}s[j+dk] = temp;  //插入元素}}
}
void shellSort(vector<int>& s, vector<int> dlta){  //dlta为增量数组for(int i = 0; i < dlta.size(); i++)shellInsert(s, dlta[i]);
}

二、交换排序

1. 冒泡排序

void bubbleSort(vector<int>& s){for(int i = 0; i < s.size() - 1; i++){  //n-1趟排序for(int j = 0; j < s.size() - i; j++){  //每趟排序比较n-i次if(s[i] > s[i+1]){int temp = s[i];s[i] = s[i+1];s[i+1] = temp;}}}
}
//改进的冒泡排序:一旦某一趟比较时不出现记录交换,说明已经排好序了,可以直接结束算法,不需要再进行后续比较。
void bubbleSort1(vector<int>& s){int flag = 1;for(int i = 0; i < s.size() - 1 && flag == 1; i++){  //n-1趟排序flag = 0;for(int j = 0; j < s.size() - i; j++){  //每趟排序比较n-i次if(s[i] > s[i+1]){flag = 1;int temp = s[i];s[i] = s[i+1];s[i+1] = temp;}}}
}

2. 快速排序

int partition(vector<int>& s, int low, int high){int temp = s[low];while(low < high){while(low < high && s[low] < temp)low++;s[low] = s[high];while(low < high && s[high] > temp)high--;s[high] = s[low];}s[low] = temp;return low;
}
void Qsort(vector<int>& s, int low, int high){if(low < high){int loc = partition(s, low, high);Qsort(s, low, loc-1);Qsort(s, loc+1, high);}
}

三、选择排序

1. 简单选择排序:每次从待排序的序列中选择最小的数,存放在待排序序列的起始位置

void selectSort(vector<int>& s){for(int i = 0; i < s.size()-1; i++){int min = i;for(int j = i+1; j < s.size(); j++){if(s[j] < s[min])min = j;}if(min != i){int temp = s[i];s[i] = s[min];s[min] = temp;}}}

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

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

相关文章

C++初阶学习第一弹——C++入门(上)

前言&#xff1a; 很高兴&#xff0c;从今天开始&#xff0c;我们就要步入C的学习了&#xff0c;在这之前我们已经对C语言有了不错的了解&#xff0c;对数据结构也有了一些自己的认识&#xff0c;今天开始&#xff0c;我们就进入这个新的主题的学习——C 目录 一、C的发展即其特…

一个快速克隆方法引出深浅拷贝说明

提供的代码是一个泛型扩展方法&#xff0c;用于对任意类型的对象T进行浅拷贝&#xff08;shallow copy&#xff09;。这个方法使用反射来调用对象的MemberwiseClone方法&#xff0c;该方法为所有字段&#xff08;包括值类型和引用类型字段&#xff09;创建新的副本&#xff0c;…

解析OceanBase v4.2函数索引进行查询优化

一、如何通过函数索引来进行查询优化 函数索引是一种优化查询的技术&#xff0c;其主要作用在于提升包含函数调用的查询语句的执行速度。当查询语句中包含函数调用时&#xff0c;数据库系统需要逐行执行函数计算&#xff0c;这无疑会增加查询的复杂性&#xff0c;导致查询速度…

【C语言】多字节字符、宽字符(涉及字符集和编码)

字符集、编码&#xff1a; 字符集&#xff1a;一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称&#xff0c;包括各国家文字、标点符号、图形符号、数字等。例如&#xff1a;ASCII、Unicode、GB2312、GBK、GB18030、BIG5(繁体中文) ... 编码方式&#xff1a;符号…

【Flutter】自动生成图片资源索引插件一:FlutterAssetRefGenerator

介绍 FlutterAssetRefGenerator 插件&#xff1a;windows上 点击生成图片索引按钮后&#xff0c;pubspec.yaml 会出现中文乱码&#xff0c;需要手动改乱码&#xff1b;mac上没问题。 优点&#xff1a;点击图标自动生成。 目录 介绍一、安装二、使用 一、安装 安装FlutterAsset…

移动端不居中问题/安卓和ios下line-height上下居中 css兼容问题

移动端开发过程&#xff0c;经常会写带0.5px边框角标类的样式&#xff0c;直接使用border设置0.5px边框&#xff0c;ios有些机型会出现显示不完整的情况。所以改用伪元素方法实现边框。代码如下&#xff1a; .comment-entry::after{content: ;position: absolute;left: 0;top: …

快速IO的方式|Java快读模板

处理IO的方式&#xff1a; 处理输入和输出的方式&#xff1a; C&#xff1a;cin / cout Java&#xff1a;Scanner / System.out 但是这两种有超时的风险 那么C处理方式&#xff1a;直接改为scanf / printf &#xff0c;也就是C语言中的读写方式 Java处理方式&#xff1a;准备一…

Python 中 + 和 += 赋值操作的性能比较

1. 问题背景 在 Python 中&#xff0c;我们可以通过 和 … 完成累加操作&#xff0c;在实际开发过程中我们一般会优先选择 &#xff0c;然而最近在对比 和 … 的性能时出现了 反而更慢的现象。因此&#xff0c;我们决定对此问题进行深入探讨。 2. 解决方案 为了准确地…

C语言---贪吃蛇(一)---准备工作

文章目录 前言1.Win32 API介绍1.1.Win32 API1.2. 控制台程序1.3.控制台屏幕上的坐标[COORD](https://learn.microsoft.com/zh-cn/windows/console/coord-str)1.4.[GetStdHandle](https://learn.microsoft.com/zh-cn/windows/console/getstdhandle)1.5.[GetConsoleCursorInfo](h…

视频太大怎么压缩变小?8种方法随时压缩视频大小

视频太大怎么压缩变小&#xff1f;视频压缩方式分为两种&#xff0c;有损压缩和无损压缩&#xff0c;什么是有损什么是无损压缩&#xff0c;什么时候视频用无损压缩更好&#xff1f;什么时候用有损压缩更好&#xff1f;如何调整视频参数实现基本无损压缩&#xff1f; 今天就借助…

九章云极DataCanvas AIDC OS智算操作系统正式发布,开启AI智算新纪元

4月18日&#xff0c;2024九章云极DataCanvas智算操作系统新品发布会于北京隆重召开&#xff0c;全新产品DATACANVAS AIDC OS智算操作系统&#xff08;以下简称AIDC OS&#xff09;正式官宣。AIDC OS以卓越的AI技术实力和AI基础软件为根基&#xff0c;以重新定义和突破传统为创新…

我独自升级崛起在哪里下载 我独自升级崛起一键下载方法极速体验

我独自升级崛起在哪里下载 我独自升级崛起一键下载方法极速体验 最近在游戏圈内爆火的一款游戏《我独自升级&#xff1a;崛起》是一款由韩国漫画改编而成的热门多人网络在线联机游戏&#xff0c;这款游戏是一款的角色扮演游戏&#xff0c;游戏有着引人入胜的剧情模式。玩家们…

Docker 入门指南:快速上手 Docker

Docker 是一种开源的容器化平台&#xff0c;它可以帮助开发者轻松地打包、发布和运行应用程序。本指南将介绍 Docker 的基本概念和常用操作&#xff0c;帮助你快速入门 Docker 技术。 1. 安装 Docker 首先&#xff0c;你需要在你的操作系统上安装 Docker。Docker 支持多种操作…

m4a转wav怎么转?3个简单的转换方法~

随着音频的迅猛发展&#xff0c;不同的音频文件格式应运而生&#xff0c;其中M4A和WAV都备受欢迎。M4A格式的兴起始于对音质和压缩效率的双重追求&#xff0c;而WAV则因其高保真特性而成为专业录音室的首选。 M4A格式的由来 M4A格式最初是由苹果公司引入的&#xff0c;旨在提供…

ZCC5080E USB 5V 输入 1A 双节锂电池充电管理 IC替代CS5080E

概要&#xff1a; ZCC5080E 是一款 5V USB 适配器输入&#xff0c;高精度双节锂离子电池充电管理芯片。具有0V充电功能&#xff0c;涓流充电、恒流充电、恒压充电和自动截止、自动再充等一套完整充电循环的充电管理芯片。芯片内部特设 9V 抗浪涌&#xff0c;芯片应用更安全可…

6、JVM-JVM调优工具与实战

前置启动程序 事先启动一个web应用程序&#xff0c;用jps查看其进程id&#xff0c;接着用各种jdk自带命令优化应用 Jmap 此命令可以用来查看内存信息&#xff0c;实例个数以及占用内存大小 jmap -histo 14660 #查看历史生成的实例 jmap -histo:live 14660 #查看当前存活的实…

探索人工智能绘图的奇妙世界

探索人工智能绘图的奇妙世界 人工智能绘图的基本原理机器之美&#xff1a;AI绘图作品AI绘图对艺术创作的影响未来展望与挑战图书推荐&#x1f449;AI绘画教程&#xff1a;Midjourney使用方法与技巧从入门到精通内容简介获取方式&#x1f449;搜索之道&#xff1a;信息素养与终身…

CSS 实现视差滚动效果

一、是什么 视差滚动&#xff08;Parallax Scrolling&#xff09;是指多层背景以不同的速度移动&#xff0c;形成立体的运动效果&#xff0c;带来非常出色的视觉体验 我们可以把网页解刨成&#xff1a;背景层、内容层、悬浮层 当滚动鼠标滑轮的时候&#xff0c;各个图层以不…

启明云端ESP32-S3+车载桥接器案例,能实现对车载产品集控

最近房车旅行很盛行&#xff0c;谁不想五一自驾游开车去外面玩&#xff1f;为了能提升用户体验&#xff0c;车企房车智能化升级越来越普遍&#xff0c;接下来小启给大家讲一个案例&#xff0c;启明云端ESP32-S3车载桥接器&#xff0c;感兴趣的可以看看。 一、ESP32-S3车载桥接器…

分享4款免费ai绘画工具!

随着人工智能技术的飞速发展&#xff0c;AI绘画工具已经逐渐走入了我们的日常生活。这些工具不仅能够简化绘画过程&#xff0c;更能让普通人体验到艺术创作的乐趣。今天&#xff0c;我们就来盘点一下那些值得一试的免费AI绘画工具&#xff0c;看看它们如何让我们的创作欲望得到…