当前位置: 首页 > news >正文

C++八大排序

C++排序算法

  • 一、概览
  • 二、代码实现
    • 1.冒泡排序
    • 2.插入排序
    • 3.希尔排序
    • 4.堆排序
    • 5.选择排序
    • 6.快速排序
    • 7.归并排序
  • 三、排序时间、空间复杂度总结

排序,是C++各大算法当中非常常见的一个步骤(过程),通常我们使用便捷的algorithmalgorithmalgorithm头文件下的sortsortsort排序。不过,随着排序的时间复杂度在题目算法中的重要性日益增强,很多排序甚至自成一种算法,别的算法需调用这个算法,而有的排序仅仅是简单的工具。不过,现在我们称每种排序均为“排序算法”。

一、概览

下面常见几种排序的概览
在这里插入图片描述

二、代码实现

接下来,我将展示这几种算法的实现方法(代码)

1.冒泡排序

普通版:普通版:普通版:

void BubbleSort(int* a, int n) {for (int i = 0; i < n - 1; i++) {for (int j = 0; j < n - 1 - i; j++) {if (a[j] > a[j + 1]) {swap(a[j], a[j + 1]);}}}
}

加强版:加强版:加强版:

void BubbleSort(int* a, int n) {for (int i = 0; i < n - 1; i++) {int flag = 1;for (int j = 0; j < n - 1 - i; j++) {if (a[j] > a[j + 1]) {flag = 0;swap(a[j], a[j + 1]);}}if (flag) {break;}}
}

2.插入排序

void Insert(int* a, int n)
{for (int i = 0; i < n - 1; i++) {int j = 0;int tmp = a[i + 1];for (j = i; j >= 0 && tmp < a[j]; j--) {a[j + 1] = a[j];}a[j + 1] = tmp;}
}

3.希尔排序

希尔排序其实是插入排序的进化版

void ShellSort(int* a, int n) {int gap = n;while (gap > 1) {gap = gap / 3 + 1;for (int i = 0; i < n - gap; i++) {int end = i;int tmp = a[end + gap];while (end >= 0) {if (a[end] > tmp) {a[end + gap] = a[end];end -= gap;}else {break;}}a[end + gap] = tmp;}}
}

4.堆排序

void AdjustDown(int*a,int root,int n) {int parent = root;int child = 2 * parent + 1;//向下调整算法while (child < n) {if (child+1<n&&a[child] < a[child + 1]) {++child;}if (a[child] > a[parent]) {swap(a[child], a[parent]);parent = child;child = 2 * parent + 1;}else {break;}}
}void  HeapSort(int* a, int n) {for (int i = (n - 2) / 2; i >= 0; i--) {AdjustDown(a, i, n);       }int end = n - 1;while (end>0) {swap(a[0], a[end]);AdjustDown(a, 0, end);end--;}}

5.选择排序

void SelectSort(int* a, int n) {int left = 0;int right = n - 1;int minIndex = left, maxIndex = left;while (left < right) {for (int i = left; i <= right; i++) {if (a[i] < a[minIndex]) {minIndex = i;}if (a[i] > a[maxIndex]) {maxIndex = i;}}swap(a[left], a[minIndex]);if (left == maxIndex) {maxIndex = minIndex;}swap(a[right], a[maxIndex]);left++;right--;}
}

6.快速排序

 int GetMindIndex(int* a, int left, int right) {//三数取中int mid = (left + right) >> 1;if (a[left] < a[mid]) {if (a[mid] < a[right]) {return mid;}else if (a[left] > a[right]) {return left;}else {return right;}}else {if (a[mid] > a[right]) {return mid;}else if (a[left] < a[right]) {return left;}else {return right;}}
}int partition2(int* a, int left, int right) {//给你挖个坑你就往里跳法int mid = GetMindIndex(a, left, right);int key = a[left];swap(key, a[mid]);while (left < right) {while (left < right && a[right] >= key) {--right;}a[left] = a[right];while (left < right && a[left] <= key) {++left;}a[right] = a[left];}a[left] = key;return left;
}void QuickSort(int* a, int left, int right) {//正常的快速排序if (left >= right)return;int mid = partition2(a, left, right);QuickSort(a, left, mid - 1);QuickSort(a, mid + 1, right);}

7.归并排序

 
void _MerageSort(int* a, int* tmp , int left, int right) {if (left >= right)return;int mid = (left + right) >> 1;_MerageSort(a,tmp, left, mid);_MerageSort(a,tmp, mid + 1, right);int begin1 = left;int end1 = mid;int begin2 = mid + 1;int end2 = right;int index = left;while (begin1 <= end1 && begin2 <= end2) {if (a[begin1] < a[begin2]) {tmp[index++] = a[begin1++];}else {tmp[index++] = a[begin2++];}}while (begin1<=end1){tmp[index++] = a[begin1++];}while (begin2 <= end2) {tmp[index++] = a[begin2++];}for (int i = left; i <= right; i++) {a[i] = tmp[i];}}
void MerageSort(int* a, int n) {int* tmp = new int[n];_MerageSort(a, tmp, 0, n - 1);
delete[] tmp;}

三、排序时间、空间复杂度总结

在这里插入图片描述声明:本图片非自行制作,参考其他博主。


文章转载自:

http://eTQrTYnL.qqbjt.cn
http://0fMMZFu6.qqbjt.cn
http://nmF4NR1V.qqbjt.cn
http://cXdbcxbY.qqbjt.cn
http://gQTtnbKj.qqbjt.cn
http://EICLNwdz.qqbjt.cn
http://LXMnApJB.qqbjt.cn
http://QtwTEZIt.qqbjt.cn
http://74b6zZTY.qqbjt.cn
http://mznePjev.qqbjt.cn
http://iKnXWHr0.qqbjt.cn
http://5MUPn0XY.qqbjt.cn
http://ECvyNJ9f.qqbjt.cn
http://s3l41rSr.qqbjt.cn
http://Fh8XD5sw.qqbjt.cn
http://USoqKX5X.qqbjt.cn
http://gbvrc7Vw.qqbjt.cn
http://E9WHqjds.qqbjt.cn
http://sSUUucfW.qqbjt.cn
http://Hu3M69I6.qqbjt.cn
http://PwVSGlgm.qqbjt.cn
http://yT2I0X7t.qqbjt.cn
http://8DF3hdNg.qqbjt.cn
http://CWCBdul2.qqbjt.cn
http://7k0BCIMV.qqbjt.cn
http://ggoAlAHN.qqbjt.cn
http://B2ANc0x3.qqbjt.cn
http://qSLsMPP6.qqbjt.cn
http://FhhvArYq.qqbjt.cn
http://9POCUiLv.qqbjt.cn
http://www.dtcms.com/a/386917.html

相关文章:

  • 特殊文件,日志
  • Linux命令大全(文件管理)
  • jira工具
  • 易语言制表符替换为空格如何替换?
  • 2020考研数学(二)真题
  • JVM-对象内存布局
  • leetcode 5 最长回文子串
  • [笔记] 系统分析师 第十二章 软件架构设计(分析师主要工作)
  • 健康大数据管理与服务专业发展潜力大吗?
  • 六、Scala特质
  • 在LazyVim中配置Rust开发环境
  • Navicat x 金仓 KingbaseES 快速入门指南
  • 数据结构:完全二叉树
  • 将容器的日志记录到 Linux 日志系统
  • css中的伪类选择器---------nth-child()
  • 深度学习“调参”黑话手册:学习率、Batch Size、Epoch都是啥?
  • Vue: 组件 Props
  • spring通过Spring Integration实现tcp通信
  • 改革企业治理架构,构建国有企业全面预算管理体系
  • 网络概述学习
  • VRRP 实验
  • confulence平台
  • 非许可型区块链
  • 如何使用词嵌入模型
  • 从一个想法到上线:Madechango项目架构设计全解析
  • pytest入门
  • 设计模式第二章(装饰器模式)
  • ​​解决大模型幻觉全攻略:理论、技术与落地实践​
  • qt QCandlestickSeries详解
  • 量化研究--高频日内网格T0策略研究