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,一经查实,立即删除!

相关文章

1036. 跟奥巴马一起编程(15)

美国总统奥巴马不仅呼吁所有人都学习编程&#xff0c;甚至以身作则编写代码&#xff0c;成为美国历史上首位编写计算机代码的总统。2014年底&#xff0c;为庆祝“计算机科学教育周”正式启动&#xff0c;奥巴马编写了很简单的计算机代码&#xff1a;在屏幕上画一个正方形。现在…

库文件与头文件

首先说明库文件与头文件在gcc中的具体使用方法&#xff0c;然后说明两者的区别与联系。 库文件即库函数&#xff0c;如printf和scanf函数。以libgtdf.so库文件为例&#xff08;库文件在命名时都以lib开头&#xff0c;因此使用-l选项去链接指定的库文件时可以省略lib三个字母&am…

gcc的常用参数

-c 编译成目标文件.o&#xff08;只编译不链接&#xff09; gcc -c hello.s -o hello.o -o 指出输出文件名&#xff0c;输出文件名跟在-o后面。如果不使用这一选项&#xff0c;则缺省的输出文件名为a.out。gcc hello.c -o hello.exe&#xff08;在Linux中该项后缀名无要求&a…

1027. 打印沙漏(20)

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”&#xff0c;要求按下列格式打印 ************ *****所谓“沙漏形状”&#xff0c;是指每行输出奇数个符号&#xff1b;各行符号中心对齐&#xff1b;相邻两行符号数差2&#xff1b;符号数先从大到小顺序递减…

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

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

C命令行参数

C命令行参数的作用是在执行程序时&#xff0c;可以将命令行的参数传值给C程序内部&#xff0c;这样就可以从外部控制程序&#xff0c;而不是在代码内对这些值进行硬编码。命令行参数是使用main函数来处理的&#xff0c;argc是指参数的个数&#xff0c;为int类型&#xff1b;arg…

剖析数组名、函数名(不是指针常量,更不是指针)

对于一个数组&#xff0c;如 int a[4]; 如果只是给出数组名a&#xff0c;编译器不知道该取该数组的第几个元素&#xff0c;因此编译器不会自动取值&#xff0c;而是返回该数组的首地址&#xff08;第一个元素的地址&#xff09;。其实&#xff0c;数组名a就是数组本身&#xf…

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

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

linux里source、. 、sh、bash、./有什么区别

转载&#xff1a;https://www.cnblogs.com/pcat/p/5467188.html 1.source a.sh source可以简写为“.”&#xff0c;即. a.sh 注意中间有空格&#xff0c;在当前shell内去读取、执行a.sh&#xff0c;而a.sh不需要有"执行权限"。 2.sh a.sh 和 bash a.sh 都是打开…

【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 <&…

gcc的警告提示信息

gcc包含完整的出错检查和警告提示功能。采用-pedantic选项&#xff0c;对于不符合ANSI/ISO标准的源代码会产生相应的警告信息。如&#xff1a;gcc -pedantic hello.c -o hello (main函数返回类型为int&#xff0c;且函数体内要有return 语句&#xff0c;一般为 return 0;) -pe…

1037. 在霍格沃茨找零钱(20)

如果你是哈利波特迷&#xff0c;你会知道魔法世界有它自己的货币系统 —— 就如海格告诉哈利的&#xff1a;“十七个银西可(Sickle)兑一个加隆(Galleon)&#xff0c;二十九个纳特(Knut)兑一个西可&#xff0c;很容易。”现在&#xff0c;给定哈利应付的价钱P和他实付的钱A&…

【Leetcode | 6】136. 只出现一次的数字

给定一个非空整数数组&#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 说明&#xff1a; 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗&#xff1f; 示例 1: 输入: [2,2,1] 输出: 1 示例 2: 输入…

gcc的优化功能

代码优化的目的是改善程序的执行性能。gcc提供的代码优化功能非常强大&#xff0c;它通过参数-On来控制优化代码的生成&#xff0c;其中n为优化级别的整数&#xff0c;比较典型的范围是从0变化到2或3&#xff08;与版本有关&#xff09;。 编译时通过使用选项-O可以告诉gcc同时…

gcc编译多个源代码文件的过程(引出makefile)

由foo1.c foo2.c foo3.c 3个源文件组成的源程序生成最终的可执行程序foo的命令&#xff1a; gcc foo1.c foo2.c foo3.c -o foo 如果处理的源文件不止一个&#xff0c;则gcc会依次对每个文件进行预处理、编译、汇编&#xff0c;最后将所有的目标代码和库文件进行&#xff0c;链…

观擦者模式

/********************************************************************created: 2006/07/20filename: Observer.hauthor: 李创http://www.cppblog.com/converse/purpose: Observer模式的演示代码 *********************************************************************/…

程序的装入和链接

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

内存对齐

1. 对齐原则&#xff1a; 数据成员对齐规则&#xff1a;结构(struct)(或联合(union))的数据成员&#xff0c;第一个数据成员放在offset为0的地方&#xff0c;以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中&#xff0c;比较小的那个进行。结构(或…

1006. 换个格式输出整数 (15)

让我们用字母B来表示“百”、字母S表示“十”&#xff0c;用“12...n”来表示个位数字n&#xff08;<10&#xff09;&#xff0c;换个格式来输出任一个不超过3位的正整数。例如234应该被输出为BBSSS1234&#xff0c;因为它有2个“百”、3个“十”、以及个位的4。 输入格式&a…

静态库的制作和使用

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