1. 排序算法

一、概述 

假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。

 

 

二、冒泡排序算法

1. 图解:

2. 代码: 

#include <iostream>
#include <vector>
using namespace std;void bubblesort(vector<int>& nums)
{int n = nums.size();int flag;for (int j = n - 1; j > 0; --j){flag = 0;for (int i = 0; i < j; ++i){if (nums[i] > nums[i + 1]){swap(nums[i], nums[i + 1]);flag = 1;}}if (flag == 0) break;}
}int main()
{vector<int> vec;int n;cin >> n;for (int i = 0; i < n; i++){int a;cin >> a;vec.push_back(a);}cout << "排序:";for (auto c : vec)cout << c << " ";return 0;
}

 

 

三、选择排序算法

#include <iostream>
#include <vector>
using namespace std;void selectsort(vector<int>& res)
{int n = res.size(), min;for (int i = 0; i < n - 1; ++i){min = i;for (int j = i + 1; j < n; ++j){if (res[j] < res[min])min = j;}if (i != min)swap(res[i], res[min]);}
}int main()
{int n;cin >> n;vector<int> data;for (int i = 0; i < n; ++i){int a;cin >> a;data.push_back(a);}cout << "排序:";for (auto c : data)cout << c << " ";return 0;
}

 

 

四、直接插入排序算法

1. 动态演示

2. 时间复杂度:

  • 插入排序最好、最坏、平均情况时间复杂度分析

3. 示例代码:

#include <iostream>
#include <vector>
using namespace std;void insertSort(vector<int> &num)
{int len = num.size(), j;for (int i = 1; i < len; ++i){int key = num[i];j = i - 1;while (j >= 0 && num[j] > key){num[j + 1] = num[j];--j;}num[j + 1] = key;}
}int main()
{int n;cin >> n;vector<int> num;int s;for (int i = 0; i < n; ++i){cin >> s;num.push_back(s);}insertSort(num);for (auto c : num)cout << c << " ";
}

 

 

六、

 

 

可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)。分阶段可以理解为就是递归拆分子序列的过程,递归深度为logn。

2. 治阶段:

再来看看治阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1, 2, 3, 4, 5, 6, 7, 8],来看下实现步骤。

 

代码:

 

七、快速排序算法:

 

 

八、堆排序算法:

1. 算法图解:

  • 图解堆排序

2. 代码: 

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;void heapAdjust(vector<int>& arr, int i, int len)
{int left, right, j;while ((left = 2 * i + 1) <= len)  //判断当前父节点有无左节点(即有无孩子节点,left为左节点){right = left + 1;                              //右节点j = left;                                      //j指针指向左节点if (right <= len && arr[left] < arr[right])     //右节点大于左节点j++;                                        //当前把"指针"指向右节点//将父节点与孩子节点交换(如果上面if为真,则arr[j]为右节点,如果为假arr[j]则为左节点)if (arr[i] < arr[j])    swap(arr[i], arr[j]);else         //说明比孩子节点都大,直接跳出循环语句break;i = j;}
}void heapSort(vector<int> & arr)
{int len = arr.size() - 1;for (int i = len / 2 - 1; i >= 0; i--)heapAdjust(arr, i, len);while (len >= 0){swap(arr[0], arr[len--]);   //将堆顶元素与尾节点交换后,长度减1,尾元素最大heapAdjust(arr, 0, len);    //再次对堆进行调整}
}int main()
{vector<int> vec;int n;cin >> n;for (int i = 0; i < n; i++){int a;cin >> a;vec.push_back(a);}heapSort(vec);for (auto c : vec)cout << c << " ";return 0;
}

 

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

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

相关文章

【C++ Priemr | 15】构造函数与拷贝控制

继承的构造函数 1. 简介&#xff1a; 子类为完成基类初始化&#xff0c;在C11之前&#xff0c;需要在初始化列表调用基类的构造函数&#xff0c;从而完成构造函数的传递。如果基类拥有多个构造函数&#xff0c;那么子类也需要实现多个与基类构造函数对应的构造函数。 class …

【C++ Priemr | 15】面向对象程序设计

类型准换与继承 为了支持c的多态性&#xff0c;才用了动态绑定和静态绑定。 需要理解四个名词&#xff1a; 对象的静态类型&#xff1a;对象在声明时采用的类型&#xff0c;是在编译期确定的。对象的动态类型&#xff1a;目前所指对象的类型&#xff0c;是在运行期决定的。对…

【C++ Priemr | 15】虚函数表剖析(三)

一、虚拟菱形继承 #include <iostream> using namespace std;class B { public:int _b; };class C1 :virtual public B { public:int _c1; };class C2 :virtual public B { public:int _c2; };class D :public C1, public C2 { public:int _d; };int main() {cout <&…

程序的装入和链接

注&#xff1a;这是本人学习汤小丹等编写的计算机操作系统&#xff08;西安电子科技大学出版社&#xff09;的学习笔记&#xff0c;因此许多引用来源于此书&#xff0c;在正文中就不注明了&#xff01; 程序在运行前需要经过以下步骤&#xff1a;编译程序对源程序进行编译生成…

静态库的制作和使用

Linux下的静态库为lib*.a格式的二进制文件&#xff08;目标文件&#xff09;&#xff0c;对应于Windows下的.lib格式的文件。 &#xff08;1&#xff09;命名规则 lib库名字 .a libMytest.a &#xff0c;则库名字为mytest。下面以具体的代码为例介绍如何制作静态库。 //mai…

虚拟地址空间

对于每一个进程都会对应一个虚拟地址空间&#xff0c;对于32位的操作系统&#xff08;其指令的位数最大为32位&#xff0c;因此地址码最多32位&#xff09;&#xff0c;虚拟地址空间的大小为B即0~4GB的虚拟地址空间&#xff0c;其中内核空间为1GB&#xff0c;如下所示&#xff…

动态库(共享库)的制作和使用

Linux下的动态库为lib*.so格式的二进制文件&#xff08;目标文件&#xff09;&#xff0c;对应于Windows下的.dll格式的文件。 &#xff08;1&#xff09;命名规则 lib库名.so &#xff08;2&#xff09;动态库的制作 1&#xff09;生成与位置无关的代码&#xff08;.o&…

网络编程套接字API

uint32_t htonl(uint32_t hostlong); uint16_t htons(uint16_t hostshort); uint32_t ntohl(uint32_t netlong); uint16_t ntohs(uint16_t netshort);int inet_pton(int family, const char *strptr, void *addrptr); 分析&#xff1a; 第一个参数可以是AF_INET或AF_INET6&am…

gdb调试器(三)

File/file 装入想要调试的可执行文件 run(r) 执行当前被调试的程序 kill(k) 终止正在调试的程序 quit(q) 退出gdb shell 使用户不离开gdb就可以执行Linux的shell命令 backtrace(bt) 回溯跟踪&#xff08;当对代码进行调试时&#xff0c;run后…

makefile文件的书写规则(make和makefile)

对于makefile&#xff0c;掌握一个规则&#xff0c;两个变量和三个函数。下面介绍一个规则。 makefile的作用&#xff1a;一个项目代码的管理工具。当一个项目的代码文件数&#xff08;如.c文件&#xff09;太多&#xff0c;用gcc编译会太麻烦&#xff0c;如果全部文件一次性编…

makefile的两个变量(自动变量和普通变量)

(1)普通变量 如&#xff1a; objmain.o add.o sub.o mul.o div.o //将后面的值赋值给obj&#xff0c;obj就是一个普通变量 targetzsx //将zsx赋值给target makefile中已经定义的一些普通变量&#xff08;通常格式都是大写&#xff0c;类似环境变量&#xff0c;它们都是普通…

【C++ Priemr | 15】虚函数表剖析(二)

一、多重继承&#xff08;无虚函数覆盖&#xff09; 下面&#xff0c;再让我们来看看多重继承中的情况&#xff0c;假设有下面这样一个类的继承关系。注意&#xff1a;子类并没有覆盖父类的函数。 测试代码&#xff1a; class Base1 { public: virtual void f() { cout <…

makefile中的两个函数(wildcard和patsubst)

(1) wildcard函数 作用是查找指定目录下指定类型的文件&#xff0c;并最终返回一个环境变量&#xff0c;需要用$取值赋值给另一个环境变量&#xff01;该函数只有一个参数&#xff0c;如取出当前目录下的所有.c文件&#xff0c;并赋值给allc普通变量&#xff1a; allc$(wildc…

C库函数

Linux的系统I/O函数&#xff08;read、write、open、close和 lseek等&#xff09;与C语言的C库函数&#xff08;libc.so库文件中&#xff09;都是相对应的&#xff0c;它们都是动态库函数。如下图所示&#xff0c;C库函数有fopen、fclose、fwrite、fread和fseek等。这些C库函数…

C库函数与Linux系统函数之间的关系

由上小节知道&#xff0c;C库函数是借助FILE类型的结构体来对文件进行操作的&#xff0c;其本身只是在用户空间&#xff08;I/O缓冲区&#xff09;进行读写操作&#xff0c;而数据在内核与用户空间之间的传递、以及将内核与I/O设备之间的数据传递都是该C库函数进行一系列的系统…

open函数和errno全局变量

&#xff08;1&#xff09;open函数 man man 查看man文档的首页 其中DESCRIPTION部分描述了man文档的每一章的章节内容 第2章System calls为系统调用&#xff0c;即Liunx系统函数。 man 2 open 查看第二章的open函数的详细帮助文件。 open函数用于打开一个已经的文件或者创…

open函数和close函数的使用

学习几个常用的Linux系统I/O函数&#xff1a;open、close、write、read和lseek。注意&#xff0c;系统调用函数必须都考虑返回值。 &#xff08;1&#xff09;open函数的使用 首先&#xff0c;需要包含三个头文件&#xff1a;<sys/types.h> <sys/stat.h> <…

1091. Acute Stroke (30)

One important factor to identify acute stroke (急性脑卒中) is the volume of the stroke core. Given the results of image analysis in which the core regions are identified in each MRI slice, your job is to calculate the volume of the stroke core. Input Speci…

stat函数(stat、fstat、lstat)

#include <sys/types.h> #include <sys/stat.h> #include <unistd.h> //需包含头文件 有如下三个函数的函数原型&#xff1a; int stat(const char *path, struct stat *buf); 第一个形参&#xff1a;指出文件&#xff08;文件路径&#xff09;&…

【Leetcode | 235】 235. 二叉搜索树的最近公共祖先

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以是它自己…