// SortTest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
void swap(int& a, int& b) {
int c = a;
a = b;
b = c;
}
void BubbleSort(int arr[],int length) {
for (int i = 0; i < length-1; i++) {
for (int j = 0; j < length - i-1; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr[j], arr[j+ 1]);
//此处可增加是否跳出标记 标记为真
}
}
//此处检测跳出标记 若标记为假 则说明此次循环数据已无变动
//排序结束 可跳出循环
}
}
void PrintArray(int arr[], int length) {
for (int i = 0; i < length; i++) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
}
void TestBubbleSort() {
int testArr1[] = { 12,76,12,18,99,12,12,35,12,12 };
int testArr2[] = { 1,2,3,8,7,4,5,6,7,8,9,0 };
int testArr3[] = { 0,9,3,4,8,7,99,6,7,88,5,33,66,4,3,2,1 };
#define TESTARR(ARR) \
do{ \
BubbleSort(ARR, sizeof(ARR) / sizeof(ARR[0])); \
PrintArray(ARR, sizeof(ARR) / sizeof(ARR[0])); \
}while(0)
TESTARR(testArr1);
TESTARR(testArr2);
TESTARR(testArr3);
std::cout << std::endl;
}
//=============================================================
void QuickSort(int arr[], int left, int right) {
int i = left;
int j = right;
if (left >= right)
return;
int temp = arr[left];
while (i != j) {
while (j != i && arr[j] >= temp)
j--;
while (j != i && arr[i] <= temp)
i++;
if (i < j) {
swap(arr[i],arr[j]);
}
}
arr[left] = arr[i];
arr[i] = temp;
QuickSort(arr,left,i-1);
QuickSort(arr, i+1,right);
}
void TestQuickSort() {
int testArr1[] = { 12,76,12,18,99,12,12,35,12,12 };
int testArr2[] = { 1,2,3,8,7,4,5,6,7,8,9,0 };
int testArr3[] = { 0,9,3,4,8,7,99,6,7,88,5,33,66,4,3,2,1 };
#define TESTQUICKARR(ARR) \
do{ \
QuickSort(ARR, 0,sizeof(ARR) / sizeof(ARR[0])-1); \
PrintArray(ARR, sizeof(ARR) / sizeof(ARR[0])); \
}while(0)
TESTQUICKARR(testArr1);
TESTQUICKARR(testArr2);
TESTQUICKARR(testArr3);
std::cout << std::endl;
}
//=======================================
struct HeapArray {
int heapArr[100];
int heapSize;
HeapArray() {
heapSize = 0;
for (int i = 0; i < 100; i++) {
heapArr[i] = -1;
}
}
};
HeapArray heapA;
void HeadpAdjustTopDown(int index) {
while(index*2+1 <= heapA.heapSize-1){
if (index * 2 + 2 <= heapA.heapSize - 1) {
if (heapA.heapArr[index] > heapA.heapArr[index * 2 + 1] &&
heapA.heapArr[index * 2 + 1] <= heapA.heapArr[index * 2 + 2]) {
swap(heapA.heapArr[index], heapA.heapArr[index * 2 + 1]);
index = index * 2 + 1;
continue;
}
else if (heapA.heapArr[index] > heapA.heapArr[index * 2 + 2] &&
heapA.heapArr[index * 2 + 2] <= heapA.heapArr[index * 2 + 1]) {
swap(heapA.heapArr[index], heapA.heapArr[index * 2 + 2]);
index = index * 2 + 2;
continue;
}
}
else { // 仅有左儿子情况
if (heapA.heapArr[index] > heapA.heapArr[index * 2 + 1]) {
swap(heapA.heapArr[index], heapA.heapArr[index * 2 + 1]);
index = index * 2 + 1;
continue;
}
}
break;
}
}
void HeadpAdjustDownTop(int index) {
int i = index;
while (i != 0) {
if (heapA.heapArr[i] < heapA.heapArr[(i - 1) / 2]) {
swap(heapA.heapArr[i], heapA.heapArr[(i - 1) / 2]);
i = (i-1) / 2;
}
else {
break;
}
}
}
void HeapInsert(int in) {
heapA.heapArr[heapA.heapSize] = in;
HeadpAdjustDownTop(heapA.heapSize);
heapA.heapSize++;
}
void HeapSort(int arr[],int length) {
heapA.heapSize = 0;
for (int i = 0; i < 100; i++) {
heapA.heapArr[i] = -1;
}
for (int i = 0; i < length; i++) {
HeapInsert(arr[i]);
}
}
void PrintHeap() {
int j = heapA.heapSize;
for (int i = 0; i < j; i++) {
std::cout << heapA.heapArr[0] << " ";
heapA.heapArr[0] = heapA.heapArr[heapA.heapSize - 1];
heapA.heapSize--;
HeadpAdjustTopDown(0);
}
std::cout << std::endl;
}
void TestHeapSort() {
int testArr1[] = { 12,76,12,18,99,12,12,35,12,12 };
int testArr2[] = { 1,2,3,8,7,4,5,6,7,8,9,0 };
int testArr3[] = { 0,9,3,4,8,7,99,6,7,88,5,33,66,4,3,2,1 };
#define TESTHEAPARR(ARR) \
do{ \
HeapSort(ARR, sizeof(ARR) / sizeof(ARR[0])); \
PrintHeap(); \
}while(0)
TESTHEAPARR(testArr1);
TESTHEAPARR(testArr2);
TESTHEAPARR(testArr3);
std::cout << std::endl;
}
//=================================================
void MergeArr(int arr[], int lbegin, int lend, int rbegin, int rend, int tmp[]) {
int i = lbegin,j = lend,m = rbegin, n = rend,k = 0;
while (i <= j && m <= n) {
if (arr[i] <= arr[m]) {
tmp[k++] = arr[i++];
}
else {
tmp[k++] = arr[m++];
}
}
while (i <= j)
tmp[k++] = arr[i++];
while (m <= n)
tmp[k++] = arr[m++];
for (int i = 0; i < k; i++) {
arr[lbegin + i] = tmp[i];
}
}
void MergeSort(int a[], int first, int last, int temp[]) {
if (first < last) {
int mid = (first + last) / 2;
MergeSort(a, first, mid, temp);
MergeSort(a, mid + 1, last, temp);
MergeArr(a,first,mid, mid + 1,last,temp);
}
}
bool MergeSort(int arr[], int n)
{
int *tmp = new int[n];
MergeSort(arr, 0, n - 1, tmp);
delete[] tmp;
return true;
}
void TestMergeSort() {
int testArr1[] = { 12,76,12,18,99,12,12,35,12,12 };
int testArr2[] = { 1,2,3,8,7,4,5,6,7,8,9,0 };
int testArr3[] = { 0,9,3,4,8,7,99,6,7,88,5,33,66,4,3,2,1 };
#define TESTMERGEARR(ARR) \
do{ \
MergeSort(ARR, sizeof(ARR) / sizeof(ARR[0])); \
PrintArray(ARR, sizeof(ARR) / sizeof(ARR[0])); \
}while(0)
TESTMERGEARR(testArr1);
TESTMERGEARR(testArr2);
TESTMERGEARR(testArr3);
std::cout << std::endl;
}
//=============================================
int main()
{
TestQuickSort();
TestBubbleSort();
TestHeapSort();
TestMergeSort();
return 0;
}相关推荐
Anaconda安装教程傻瓜教程
网上好多教程找的我心好累,为了方便新手安装,我这边整理了大致详细的教程,参考了好几个大佬的教程,废话不多说,直接开始~ **前言:**有人纠结先安装python还是安装anaconda,这边的建议是装anaconda,就不需要单独装python了。 其次,有小伙伴的Anaconda的安装分两种情况: 情况一:电脑现在没有装python或者现在装的可以卸载掉(装Anaconda时先卸python); 情况二:电脑目前装了python,但想保留它;
数据结构C语言版清华大学严蔚敏(学习笔记总结7)——排序全代码:冒泡排序、直接插入排序、折半排序、希尔插入排序、选择排序、堆排序、归并排序、快速排序、基数排序【另附理解笔记】
排序算法比较表格 排序算法 平均时间复杂度 最坏时间复杂度 空间复杂度 是否稳定 冒泡排序 O(n2) O(n2) O(1) 是 选择排序 O(n2) O(n2) O(1) 不是 直接插入排序 O(n2) O(n2) O(1) 是 归...
VMware 安装 Windows11
一、下载win11的镜像文件 可以在MSDN网站下载: MSDN系统库-致力于原版windows生态服务 二、创建虚拟机 1.双击打开VMware虚拟机,点击创建新的虚拟机 2.选择典型(推荐),然后点击下一步 3.在安装程序光盘映像文件下,点击浏览按钮,选择Windows 11ISO镜像文件所在的路径,在Windows 11安装文件路径中不要有中文或其他特殊符号,否则有可能引起错误。然后点击下一步 4.在选择客户机操作系统界...
JAVA-冒泡排序,归并排序,快速排序,堆排序学习
以前对各种排序都有了一个了解,但是都没有用代码去实现。 发现用代码实现还是有一点小困难的。 特别要注意逻辑思路的理清。 转载于:https://www.cnblogs.com/buptys/p/5259670.html...
华为OD机试双机位C卷-几何平均值最大子数组(Py/Java/C/C++/Js/Go)
华为OD机试(机考)2026双机位C卷 【几何平均值最大子数组】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【几何平均值最大子数组】。
基于ESM3微调的抗菌肽生成器:技术方案与实现
基于ESM3微调的抗菌肽生成器:技术方案与实现 摘要 本文提出了一种基于ESM3蛋白质语言模型的抗菌肽生成框架,采用两阶段训练策略:先在151万肽序列上预训练,再在1.3万抗菌肽数据上微调。模型能够生成具有合理长度分布、低重复率且高新颖性的抗菌肽序列。文章详细介绍了数据预处理流程、模型架构设计、训练策略及评估方法,为抗菌肽的理性设计提供了有效的计算工具。实验结果表明,该方法生成的抗菌肽序列在保持生物活性的同时具有较高的结构多样性。 关键词:抗菌肽设计;蛋白质语言模型;ESM3;深度学习;序列生成
Javascript中的冒泡排序,插入排序,选择排序,快速排序,归并排序,堆排序 算法性能分析...
阿里面试中有一道题是这样的: 请用JavaScript语言实现sort排序函数,要求:sort([5,100,6,3,-12])//返回[-12,3,5,6,100],如果你有多种解法,请阐述各种解法的思路及优缺点。(仅需用代码实现一种解法,其它解法用文字阐述思路即可) 那我们就来看一下各种解法的思路以及优缺点~ 简单排序...
从 0 到 1 打造一个“超级 IP 智能体”
这篇文章介绍了一个"超级IP智能体"的技术架构和实现方案。该项目构建了一个多模态内容生成流水线,主要流程包括:1)视频下载和音频提取;2)语音识别转换为文字稿;3)使用大语言模型对文案进行仿写和润色;4)语音合成;5)数字人口型同步;6)视频后期处理。文章详细介绍了如何使用Python和Hugging Face开源模型搭建环境,并重点展示了视频下载、语音识别(采用Whisper模型)以及文案仿写(使用Qwen1.5-7B-Chat模型)等核心模块的代码实现。所有处理均针对M3芯片Mac优
python学习-综合练习七(二分查找(递归)、线性查找、插入排序、快速排序、选择排序、冒泡排序、归并排序、堆排序)-实例
文章目录二分查找线性查找插入排序快速排序选择排序冒泡排序归并排序堆排序推荐代码一推荐代码二希尔排序拓扑排序 说明:本篇博文的知识点大部分来自 Python3 实例 二分查找 二分搜索是一种在有序数组中查找某一特定元素的搜索算法。 这种搜索算法每一次比较都使搜索范围缩小一半。 二分查找有一个特定条件,对于有序且从小到大排列的容器才能使用 这是从菜鸟教程里面截取的一张图,很好的解释了二分查找。 输入数值为4,一半是第五位:7,小于7,在前半部分。再一半取得第二位:3,大于3,在3之后的半部分里面,这样一直二分
2023年全国青少年信息素养大赛C++编程初中组决赛真题+答案解析
2023年全国青少年信息素养大赛C++编程初中组决赛真题+答案解析
TIA博途中通过UDT实现IO地址映射到DB块中的具体方法
TIA博途中通过UDT实现IO地址映射到DB块中的具体方法
数据结构与算法之归并排序(2)
将数组分解最小之后,然后合并两个有序数组,基本思路是比较两个数组的最前面的数,谁小就先取谁,取了后相应的指针就往后移一位。//上面的循环退出后,把剩余的元素依次填入到temp中,以下两个while只有一个会执行。//遍历两个数组取出小的数字,放入临时数组中。//每存入一个数字后,临时数组下标后移。//记录第一个数组中需要遍历的下标。//记录第二个数组中需要遍历的下标。//用于记录在临时数组中存放的下标。//用于存储归并后的临时数组。//把小的数组放入临时数组中。//第一个数组的数据更小。
CATIA二次开发一一一计算 CATIA 零件模型在全局坐标系下的包围盒方法
本文介绍了一种在CATIA中计算零件模型全局坐标系下包围盒(BoundingBox)的方法。通过遍历零件几何体特征点,并应用坐标变换矩阵,最终返回精确的零件包围盒。核心步骤包括初始化与输入校验、坐标变换处理、几何体特征点遍历以及全局坐标变换。关键方法涉及CATMathBox操作和坐标变换接口。该方法适用于碰撞检测、可视化优化和装配分析等场景,能够快速判断零件间的空间干涉,提升渲染性能,并计算零件在装配体中的全局位置范围。
数据结构:排序- 插入排序(插入排序and希尔排序) , 选择排序(选择排序and堆排序) , 交换排序(冒泡排序and快速排序) , 归并排序
数据结构:排序- 插入排序(插入排序and希尔排序) , 选择排序(选择排序and堆排序) , 交换排序(冒泡排序and快速排序) , 归并排序
廖雪峰Python教程[完整版]
廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白
复分析 阿尔福斯(Ahlfors) 第三版答案 英文
答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案
常见排序模板(冒泡排序,希尔排序,堆排序,归并排序,快速排序)
冒泡排序,希尔排序,堆排序,归并排序,快速排序
华为的C语言编程规范.pdf
华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。
学习报告-第二周
下周我将学习选择排序,插入排序,希尔排序,关于前面的算法学习,我还是不能熟练的运用。后面我会多刷相关的题目。这周,对于上周学习的快速排序,冒泡排序,我在LeetCode里做了相关练习。链表的部分比较吃力,我借助了豆包,后面关于链表部分我要着重学习。下面是我选的一个题目,用不同的方法进行排序。以下是我的学习笔记以及几个相关的典型题目。这周我学习了堆排序,归并排序和贪心算法。
Statistics and Machine Learning Toolbox
Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具
转载:各种排序算法的C++实现(冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序)
原始链接:https://blog.youkuaiyun.com/u013834525/article/details/82992097 各种排序算法的C++实现(冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序) 0. 写在最前面 希望大家收藏: 本文持续更新地址:https://haoqchen.site/2018/10/10/all-kind-of-sort/ 如果觉得还不错就点个赞,点个关注呗,博主会长期更新自己的学习和收获。 各个算法的详细介绍请参考这个博客:十大...
2024年十大经典排序算法的总结,前端小程序开发
推荐一些系统学习的途径和方法。每个Web开发人员必备,很权威很齐全的Web开发文档。作为学习辞典使用,可以查询到每个概念、方法、属性的详细解释,注意使用英文关键字搜索。里面的一些 HTML,CSS,HTTP 技术教程也相当不错。
排序,搜索,算法模式,算法复杂度 | 数据结构与算法综合笔记
图树字典,散列表集合链表队列栈冒泡排序,选择排序,插入排序,归并排序,快速排序,堆排序,顺序搜索,二分搜索算法排序算法先创建一个数组来表示待排序和搜索的数据结构functionArray...
python--8每日一讲:排序算法的分析--时间 |冒泡排序,选择排序, 插入排序,归并排序,堆排序,快速排序|未完end.......(中午的赶稿,想不出讲什么好,选了算法,请宽恕我)
python--4函数def,本质、值传递、引用传递、默认值参数、*参数名、**变量、lambda [参数]: 函数、偏函数、递归、递归练习。python--1作业,注释、输入输出、运算符、运算结果、三目运算符、关系表达、多值交换、偶数、随机数、三目运算、if、elif、else、while、for、break、contince、pass。HCIA——25FTP 的工作原理、功能、TFTP、控制连接、数据连接的选择、解答。通信基本概念:数据、信号、码元、信源、信道、信宿、速率、波特、带宽。
【一点一点写算法】排序算法开头
排序算法有许多,大学学习的时候接触过一些:快速排序、归并排序、堆排序、选择排序、冒泡排序、插入排序、希尔排序。大致也就这些。写出来慢慢实现,有的以前实现过,但是工作过程中,一般不用就都忘记了。写在这里,我知道写完也会忘记。但是忘记了就回来复习一下,马上就可以记起来,我不觉得这些排序算法没有用,数据结构是基础。算法是智慧的结晶,体现着一种独特的美。
基础排序算法——选择排序、插入排序、冒泡排序、快速排序、希尔排序、归并排序、堆排序、基数排序
package 算法; import java.util.Date; public class Sort { public static void main(String[] args) { String[] a = {"S", "G", "J", "E", "R", "Z", "Y", "K", "A", "X", "V", "N", "P", "O"}; ...
C# 各种内部排序方法的实现(直接插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序、基数排序)
C# 各种内部排序方法的实现(直接插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序、基数排序) 以下代码为我在学习数据结构时自己敲出来的,转载请标明出处。 数据结构学习视频为青岛大学王卓老师制作,网址:https://www.bilibili.com/video/BV1nJ411V7bd? SqList类的实现(各排序方法均为类内部方法) /// <summary> /// 顺序存储结构(0号位置为缓冲区) /// </summary> class SqLi
【数据结构】排序算法java代码 冒泡排序、快速排序、插入排序、希尔排序、选择排序、堆排序、归并排序
时间复杂度:O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(nk)<O(2n) 8大排序算法: 1.冒泡排序 (交换排序) O(n2) 2.快速排序 (交换排序) O(n2) 3.直接插入排序(插入排序) O(n2) 4.希尔排序 (插入排序) 5.简单选择排序(选择排序) O(n2) 6.堆排序 ...
2024年最新8种常见的排序算法_24种排序算法,2024C C++最新大厂面试真题总结
根据结点i,i>=n/2为叶子结点的特性,找出最后一个非叶子结点,然后拿它和它的叶子结点作比较,如果比叶子结点小,则互换(建立的是大顶堆),反之不动。第一步:把待排序的每一个元素看做一个有序表(则由n个有序表),通过两两合并,生成⌊n/2⌋个长度为2(最后一个表的长度可能小于2)的有序表。第一步:将给出的序列元素的个位进行收集,然后按照如图所示,放到对应的位置(0-9序列),并根据个位排出大小,形成了一个序列。第N步:筛选出最小的一个数,然后从剩下的数中按照上面的方法反复操作,得到需要的序列。
5万+



被折叠的 条评论
为什么被折叠?



