0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C++中十大排序算法前五个详解

C语言编程学习基地 来源:C语言编程学习基地 作者:C语言编程学习基地 2021-09-29 17:47 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本期是C++基础语法分享的第十五节,今天给大家来梳理一下十大排序算法前五个!

冒泡排序

冒泡排序思路:

1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。

2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。

3. 针对所有的元素重复以上的步骤,除了最后一个。

4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

示例:

void BubbleSort(vector《int》& v) { int len = v.size(); for (int i = 0; i 《 len - 1; ++i) for (int j = 0; j 《 len - 1 - i; ++j) if (v[j] 》 v[j + 1]) swap(v[j], v[j + 1]);}

// 模板实现冒泡排序template《typename T》 //整數或浮點數皆可使用,若要使用物件(class)時必須設定大於(》)的運算子功能void bubble_sort(T arr[], int len) { for (int i = 0; i 《 len - 1; i++) for (int j = 0; j 《 len - 1 - i; j++) if (arr[j] 》 arr[j + 1]) swap(arr[j], arr[j + 1]);}

// 冒泡排序(改进版)void BubbleSort_orderly(vector《int》& v) { int len = v.size(); bool orderly = false; for (int i = 0; i 《 len - 1 && !orderly; ++i) { orderly = true; for (int j = 0; j 《 len - 1 - i; ++j) { if (v[j] 》 v[j + 1]) { // 从小到大 orderly = false; // 发生交换则仍非有序 swap(v[j], v[j + 1]);

} } }}

选择排序

选择排序思路:

1. 在未排序序列中找到最小(大)元素,存放到排序序列的起始位置

2. 从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾

3. 以此类推,直到所有元素均排序完毕

示例:

void SelectionSort(vector《int》& v) { int min, len = v.size(); for (int i = 0; i 《 len - 1; ++i) { min = i; for (int j = i + 1; j 《 len; ++j) { if (v[j] 《 v[min]) { // 标记最小的 min = j; } } if (i != min) // 交换到前面 swap(v[i], v[min]); }}

// 模板实现template《typename T》 void Selection_Sort(std::vector《T》& arr) { int len = arr.size();

for (int i = 0; i 《 len - 1; i++) { int min = i; for (int j = i + 1; j 《 len; j++) if (arr[j] 《 arr[min]) min = j; if(i != min) std::swap(arr[i], arr[min]); }}

插入排序

插入排序思路:

1. 从第一个元素开始,该元素可以认为已经被排序

2. 取出下一个元素,在已经排序的元素序列中从后向前扫描

3. 如果该元素(已排序)大于新元素,将该元素移到下一位置

4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置

5. 将新元素插入到该位置后

6. 重复步骤2~5

示例:

void InsertSort(vector《int》& v){ int len = v.size(); for (int i = 1; i 《 len; ++i) { int temp = v[i]; for(int j = i - 1;

j 》= 0; --j) { if(v[j] 》 temp) { v[j + 1] = v[j]; v[j] = temp; } else break; } }}

快速排序

快速排序思路:

1. 选取第一个数为基准

2. 将比基准小的数交换到前面,比基准大的数交换到后面

3. 对左右区间重复第二步,直到各区间只有一个数

void QuickSort(vector《int》& v, int low, int high) { if (low 》= high) // 结束标志 return; int first = low; // 低位下标 int last = high; // 高位下标 int key = v[first]; // 设第一个为基准

while (first 《 last) { // 将比第一个小的移到前面 while (first 《 last && v[last] 》= key) last--; if (first 《 last) v[first++] = v[last];

// 将比第一个大的移到后面 while (first 《 last && v[first] 《= key) first++; if (first 《 last) v[last--] = v[first]; } // 基准置位 v[first] = key; // 前半递归 QuickSort(v, low, first - 1); // 后半递归 QuickSort(v, first + 1, high);

}

// ----------------------------------------------------

// 模板实现快速排序(递归)template 《typename T》void quick_sort_recursive(T arr[], int start, int end) { if (start 》= end) return; T mid = arr[end];

int left = start, right = end - 1; while (left 《 right) { while (arr[left] 《 mid && left 《 right) left++; while (arr[right] 》= mid && left 《 right) right--; std::swap(arr[left], arr[right]); } if (arr[left] 》= arr[end]) std::swap(arr[left], arr[end]); else left++; quick_sort_recursive(arr, start, left - 1);

quick_sort_recursive(arr, left + 1, end);}template 《typename T》 //整數或浮點數皆可使用,若要使用物件(class)時必須設定“小於”(《)、“大於”(》)、“不小於”(》=)的運算子功能void quick_sort(T arr[], int len) { quick_sort_recursive(arr, 0, len - 1);}

// ----------------------------------------------------

// 模板实现快速排序(迭代)struct Range { int start, end; Range(int s = 0, int e = 0) { start = s, end = e;

}};template 《typename T》 // 整數或浮點數皆可使用,若要使用物件(class)時必須設定“小於”(《)、“大於”(》)、“不小於”(》=)的運算子功能void quick_sort(T arr[], const int len) { if (len 《= 0) return; // 避免len等於負值時宣告堆疊陣列當機 // r[]模擬堆疊,p為數量,r[p++]為push,r[--p]為pop且取得元素 Range r[len];

int p = 0; r[p++] = Range(0, len - 1); while (p) { Range range = r[--p]; if (range.start 》= range.end) continue; T mid = arr[range.end]; int left = range.start, right = range.end - 1;

while (left 《 right) { while (arr[left] 《 mid && left 《 right) left++; while (arr[right] 》= mid && left 《 right) right--; std::swap(arr[left], arr[right]);

} if (arr[left] 》= arr[range.end]) std::swap(arr[left], arr[range.end]); else left++; r[p++] = Range(range.start, left - 1); r[p++] = Range(left + 1, range.end); }}

堆排序

堆排序:(最大堆,有序区)。从堆顶把根卸出来放在有序区之前,再恢复堆。

#include 《iostream》#include 《algorithm》using namespace std;

// 堆排序:(最大堆,有序区)。从堆顶把根卸出来放在有序区之前,再恢复堆。

void max_heapify(int arr[], int start, int end) { //建立父節點指標和子節點指標 int dad = start; int son = dad * 2 + 1; while (son 《= end) {

//若子節點指標在範圍內才做比較 if (son + 1 《= end && arr[son] 《 arr[son + 1])

//先比較兩個子節點大小,選擇最大的 son++; if (arr[dad] 》 arr[son]) //如果父節點大於子節點代表調整完畢,直接跳出函數 return; else { //否則交換父子內容再繼續子節點和孫節點比較 swap(arr[dad], arr[son]); dad = son; son = dad * 2 + 1; } }}

void heap_sort(int arr[], int len) { //初始化,i從最後一個父節點開始調整 for (int i = len / 2 - 1; i 》= 0; i--) max_heapify(arr, i, len - 1);

//先將第一個元素和已经排好的元素前一位做交換,再從新調整(刚调整的元素之前的元素),直到排序完畢 for (int i = len - 1; i 》 0; i--) { swap(arr[0], arr[i]); max_heapify(arr, 0, i - 1); }}

int main() { int arr[] = { 3, 5, 3, 0, 8, 6, 1, 5, 8, 6, 2, 4, 9, 4, 7, 0, 1, 8, 9, 7, 3, 1, 2, 5, 9, 7, 4, 0, 2, 6 };

int len = (int) sizeof(arr) / sizeof(*arr); heap_sort(arr, len); for (int i = 0; i 《 len; i++) cout 《《 arr[i] 《《 ‘ ’; cout 《《 endl; return 0;}

今天的分享就到这里了,大家要好好学C++哟~

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C++
    C++
    +关注

    关注

    22

    文章

    2122

    浏览量

    76710
  • 排序算法
    +关注

    关注

    0

    文章

    53

    浏览量

    10371

原文标题:C++基础语法梳理:算法丨十大排序算法(一)

文章出处:【微信号:cyuyanxuexi,微信公众号:C语言编程学习基地】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    C++程序异常的处理机制

    1、什么是异常处理? 有经验的朋友应该知道,在正常的CC++编程过程难免会碰到程序不按照原本设计运行的情况。 最常见的有除法分母为零,数组越界,内存分配失效、打开相应文件失败等等。 一
    发表于 12-02 07:12

    C语言的常见算法

    # C语言常见算法 C语言中常用的算法可以分为以下几大类: ## 1. 排序算法 ###
    发表于 11-24 08:29

    国产海光 OPS 电脑十大排

    国产海光OPS电脑的市场竞争已从单一参数比拼,转向“性能+适配+服务+口碑”的综合实力竞争。本次十大排名基于产品性能、适配兼容性、品牌实力、行业案例、客户口碑大核心维度,通过第三方数据调研、客户
    的头像 发表于 11-21 09:25 436次阅读
    国产海光 OPS 电脑<b class='flag-5'>十大排</b>名

    OPS 电脑厂家十大排名榜:2025年最新榜单

    在OPS电脑采购,“选对厂家”直接决定设备稳定性、适配效率与长期运维成本。本次OPS电脑厂家十大排名榜,基于研发实力、生产规模、品牌合作背书、售后保障、场景落地能力大核心维度综合评测,所有数据均
    的头像 发表于 10-16 16:24 1113次阅读
    OPS 电脑厂家<b class='flag-5'>十大排</b>名榜:2025年最新榜单

    易云物联网平台的十大功能

    在数字经济与产业智能化深度融合的浪潮下,易云物联网平台以构建了一站式智能化管理生态。平台通过整合物联网、云计算与大数据技术,打破传统产业数据孤岛,为企业提供从底层设备连接到顶层决策分析的全链路赋能。接下来让我们走进易云平台十大
    的头像 发表于 07-25 16:33 765次阅读

    永贵科技荣获2025国充换电行业十大充电枪品牌

    在5月13号刚刚落幕的2025国充换电行业十大品牌评选颁奖典礼上。永贵科技凭借卓越的技术实力与市场口碑,荣获“2025国充换电行业十大充电枪品牌”称号。
    的头像 发表于 05-22 14:11 837次阅读

    乘光而上,载誉前行|度亘核芯斩获“2024十大光学产业技术奖”!

    5月15日,“2025十大光学产业技术颁奖典礼暨产业创新大会”在武汉光谷隆重举行。度亘核芯自主研发的“高功率高效率976nmDFB锁波芯片”经行业权威评审委员会严格评审、网络投票等多维度综合评选
    的头像 发表于 05-16 17:45 1275次阅读
    乘光而上,载誉前行|度亘核芯斩获“2024<b class='flag-5'>中</b>国<b class='flag-5'>十大</b>光学产业技术奖”!

    工业路由器品牌十大排

    、产品覆盖广泛的企业。本文结合行业权威榜单与市场动态,梳理2024-2025年工业路由器品牌十大排名(排名不分先后) 一、品牌综合实力与产品特点 1. 星创易联 星创易联凭借高性能处理器与多协议兼容性稳居国内工业路由器市场前列。其产
    的头像 发表于 03-27 16:21 1846次阅读

    C++学到什么程度可以找工作?

    C++学到什么程度可以找工作?要使用C++找到工作,特别是作为软件开发人员或相关职位,通常需要掌握以下几个方面: 1. **语言基础**:你需要对C++的核心概念有扎实的理解,包括但不限于指针、内存
    发表于 03-13 10:19

    创建了用于OpenVINO™推理的自定义C++和Python代码,从C++代码获得的结果与Python代码不同是为什么?

    创建了用于OpenVINO™推理的自定义 C++ 和 Python* 代码。 在两推理过程中使用相同的图像和模型。 从 C++ 代码获得的结果与 Python* 代码不同。
    发表于 03-06 06:22

    Spire.XLS for C++组件说明

    Spire.XLS for C++ 是一款专业的 C++ Excel 组件,可以用在各种 C++ 框架和应用程序。Spire.XLS for C+
    的头像 发表于 01-14 09:40 1297次阅读
    Spire.XLS for <b class='flag-5'>C++</b>组件说明

    详解Linux sort命令之掌握排序技巧与实用案例

    在linux系统使用过程,提供了sort排序命令,支持常用的排序功能。 常用参数 sort命令支持很多参数,常用参数如下:   短参数 长参数 说明 -n – number-sort 按字符串数值
    的头像 发表于 01-09 10:10 1581次阅读

    洲明科技荣获十大照明工程企业

    近日,洲明科技作为赞助单位亮相2025全球采购商对接大会暨深圳市照明与显示工程行业协会年会,并凭借在行业的卓越贡献荣获第九届海湾照明工程奖——“十大照明工程企业”。洲明集团照明产品线研发与产品部总监李江海先生作为代表上台领奖
    的头像 发表于 01-08 14:17 1184次阅读

    EE-112:模拟C++的类实现

    电子发烧友网站提供《EE-112:模拟C++的类实现.pdf》资料免费下载
    发表于 01-03 15:15 0次下载
    EE-112:模拟<b class='flag-5'>C++</b><b class='flag-5'>中</b>的类实现

    TimSort:一在标准函数库中广泛使用的排序算法

    排序算法呢? 本文将带你走进 TimSort,一在标准函数库中广泛使用的排序算法。 这个算法
    的头像 发表于 01-03 11:42 954次阅读