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++
    +关注

    关注

    21

    文章

    2102

    浏览量

    73460
  • 排序算法
    +关注

    关注

    0

    文章

    52

    浏览量

    10047

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

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

收藏 人收藏

    评论

    相关推荐

    C语言和C++结构体的区别

    同样是结构体,看看在C语言和C++中有什么区别?
    的头像 发表于 10-30 15:11 109次阅读

    时间复杂度为 O(n^2) 的排序算法

    作者:京东保险 王奕龙 对于小规模数据,我们可以选用时间复杂度为 O(n2) 的排序算法。因为时间复杂度并不代表实际代码的执行时间,它省去了低阶、系数和常数,仅代表的增长趋势,所以在小规模数据情况下
    的头像 发表于 10-19 16:31 985次阅读
    时间复杂度为 O(n^2) 的<b class='flag-5'>排序</b><b class='flag-5'>算法</b>

    ostream在c++的用法

    ostream 是 C++ 标准库中一非常重要的类,它位于 头文件(实际上,更常见的是通过包含 头文件来间接包含 ,因为 包含了 和 )。 ostream 类及其派生类(如 std::cout
    的头像 发表于 09-20 15:11 441次阅读

    C++实现类似instanceof的方法

    C++有多态与继承,但是很多人开始学习C++,有时候会面临一常见问题,就是如何向下转型,特别是不知道具体类型的时候,这个时候就希望C++ 可以向Java或者Python中有insta
    的头像 发表于 07-18 10:16 520次阅读
    <b class='flag-5'>C++</b><b class='flag-5'>中</b>实现类似instanceof的方法

    手把手教你排序算法怎么写

    新记录插入。以{3,0,9,8,2}无序表按升序排列为例,有序表是一虚拟的顺序表:1.插入排序刚开始,有序表没有数据,因此直接插入3即可。{3}2.插入0的时候要
    的头像 发表于 06-04 08:03 631次阅读
    手把手教你<b class='flag-5'>排序</b><b class='flag-5'>算法</b>怎么写

    C/C++两种宏实现方式

    #ifndef的方式受C/C++语言标准支持。它不仅可以保证同一文件不会被包含多次,也能保证内容完全相同的两文件(或者代码片段)不会被不小心同时包含。
    的头像 发表于 04-19 11:50 535次阅读

    鸿蒙OS开发实例:【Native C++

    使用DevEco Studio创建一Native C++应用。应用采用Native C++模板,实现使用NAPI调用C标准库的功能。使用C
    的头像 发表于 04-14 11:43 2464次阅读
    鸿蒙OS开发实例:【Native <b class='flag-5'>C++</b>】

    使用 MISRA C++:2023® 避免基于范围的 for 循环中的错误

    在前两篇博客,我们 向您介绍了新的 MISRA C++ 标准 和 C++ 的历史 。在这篇博客,我们将仔细研究以 C++
    的头像 发表于 03-28 13:53 717次阅读
    使用 MISRA <b class='flag-5'>C++</b>:2023® 避免基于范围的 for 循环中的错误

    FPGA实现双调排序算法的探索与实践

    双调排序(BitonicSort)是数据独立(Data-independent)的排序算法,即比较顺序与数据无关,特别适合并行执行。在了解双调排序
    发表于 03-14 09:50 527次阅读
    FPGA实现双调<b class='flag-5'>排序</b><b class='flag-5'>算法</b>的探索与实践

    C语言实现经典排序算法概览

    冒泡排序(英语:Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两元素,如果他们的顺序(如从大到小、首字
    的头像 发表于 02-25 12:27 417次阅读
    <b class='flag-5'>C</b>语言实现经典<b class='flag-5'>排序</b><b class='flag-5'>算法</b>概览

    计算机视觉的十大算法

    随着科技的不断发展,计算机视觉领域也取得了长足的进步。本文将介绍计算机视觉领域的十大算法,包括它们的基本原理、应用场景和优缺点。这些算法在图像处理、目标检测、人脸识别等领域有着广泛的应用,对计算机
    的头像 发表于 02-19 13:26 1185次阅读
    计算机视觉的<b class='flag-5'>十大</b><b class='flag-5'>算法</b>

    C++简史:C++是如何开始的

    MISRA C++:2023,MISRA® C++ 标准的下一版本,来了!为了帮助您做好准备,我们介绍了 Perforce 首席技术支持工程师 Frank van den Beuken 博士撰写
    的头像 发表于 01-11 09:00 517次阅读
    <b class='flag-5'>C++</b>简史:<b class='flag-5'>C++</b>是如何开始的

    十大排序算法总结

    排序算法是最经典的算法知识。因为其实现代码短,应该广,在面试中经常会问到排序算法及其相关的问题。一般在面试中最常考的是快速
    的头像 发表于 12-20 10:39 1069次阅读

    C语言和C++那些不同的地方

    C语言虽说经常和C++在一起被大家提起,但可千万不要以为它们是一东西。现在我们常用的C语言是C89标准,
    的头像 发表于 12-07 14:29 894次阅读
    <b class='flag-5'>C</b>语言和<b class='flag-5'>C++</b><b class='flag-5'>中</b>那些不同的地方

    c++多行注释快捷键

    C++,多行注释(也称为块注释)是一种用于注释大段代码或多个语句的方法。当你希望暂时禁用一些代码或者解释特定部分代码的作用时,多行注释是非常有用的。 在C++,多行注释以 /*
    的头像 发表于 11-22 10:24 8006次阅读