十大排序算法的实现(C/C++)

以下是十大经典排序算法的简单 C++ 实现:

  1. 冒泡排序(Bubble Sort):
  • 思想:重复地遍历要排序的列表,比较相邻的两个元素,如果它们的顺序错误就交换它们。
  • 时间复杂度:最坏情况和平均情况为O(n^2),最好情况为O(n)。
void bubbleSort(int arr[], int size) {for (int i = 0; i < size-1; i++) {for (int j = 0; j < size-i-1; j++) {if (arr[j] > arr[j+1]) {std::swap(arr[j], arr[j+1]);}}}
}
  1. 选择排序(Selection Sort):
  • 思想:将数组分成已排序和未排序两部分,每次从未排序部分选择最小(或最大)的元素,将其放入已排序部分的末尾。
  • 时间复杂度:最坏情况、平均情况、最好情况均为O(n^2)。
void selectionSort(int arr[], int size) {for (int i = 0; i < size-1; i++) {int minIdx = i;for (int j = i+1; j < size; j++) {if (arr[j] < arr[minIdx]) {minIdx = j;}}std::swap(arr[i], arr[minIdx]);}
}
  1. 插入排序(Insertion Sort):
  • 思想:将数组分成已排序和未排序两部分,每次从未排序部分选择一个元素插入到已排序部分的合适位置。
  • 时间复杂度:最坏情况和平均情况为O(n^2),最好情况为O(n)。
void insertionSort(int arr[], int size) {for (int i = 1; i < size; i++) {int key = arr[i];int j = i - 1;while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j--;}arr[j + 1] = key;}
}
  1. 希尔排序(Shell Sort):
  • 思想:对插入排序的一种改进,通过将数据分成多个小块分别进行插入排序,然后逐步扩大块的大小。
  • 时间复杂度:取决于选择的间隔序列,最好的间隔序列时间复杂度为O(n log^2 n)。
void shellSort(int arr[], int size) {for (int gap = size/2; gap > 0; gap /= 2) {for (int i = gap; i < size; i++) {int temp = arr[i];int j;for (j = i; j >= gap && arr[j-gap] > temp; j -= gap) {arr[j] = arr[j-gap];}arr[j] = temp;}}
}
  1. 归并排序(Merge Sort):
  • 思想:归并排序是一种分治算法,它将一个大问题分解成小问题,解决小问题,然后将它们的解合并成一个整体的解。

步骤:

  1. 将数组分成两半,递归地对每半部分进行归并排序。
  2. 将两个有序的子数组合并成一个有序数组。
  • 时间复杂度:始终为O(nlogn),适用于大数据集。
void merge(int arr[], int left, int mid, int right) {int i, j, k;int n1 = mid - left + 1;int n2 = right - mid;int L[n1], R[n2];for (i = 0; i < n1; i++)L[i] = arr[left + i];for (j = 0; j < n2; j++)R[j] = arr[mid + 1 + j];i = 0;j = 0;k = left;while (i < n1 && j < n2) {if (L[i] <= R[j]) {arr[k] = L[i];i++;} else {arr[k] = R[j];j++;}k++;}while (i < n1) {arr[k] = L[i];i++;k++;}while (j < n2) {arr[k] = R[j];j++;k++;}
}void mergeSort(int arr[], int left, int right) {if (left < right) {int mid = left + (right - left) / 2;mergeSort(arr, left, mid);mergeSort(arr, mid + 1, right);merge(arr, left, mid, right);}
}
  1. 快速排序(Quick Sort):
  • 思想:采用分治策略,通过选择一个基准元素,将数组分成两部分,小于基准的放在左边,大于基准的放在右边,然后递归地对左右两部分进行排序。
  • 时间复杂度:最坏情况为O(n^2),平均情况为O(n log n),最好情况为O(n log n)。
#include <iostream>
#include <vector>int partition(std::vector<int>& arr, int low, int high) {int pivot = arr[high];  // 选择最后一个元素作为基准值int i = low - 1;  // i 是小于基准值的元素的最右位置(即i和i左边下标的元素都小于基准值)for (int j = low; j <= high - 1; j++) {if (arr[j] <= pivot) {i++;std::swap(arr[i], arr[j]);  // 将小于基准值的元素放到 i 的位置}}std::swap(arr[i + 1], arr[high]);  // 将基准值放到正确的位置return i + 1;
}void quickSort(std::vector<int>& arr, int low, int high) {if (low < high) {int pi = partition(arr, low, high);  // 分割数组quickSort(arr, low, pi - 1);  // 对左半部分进行递归排序quickSort(arr, pi + 1, high);  // 对右半部分进行递归排序}
}
  1. 堆排序(Heap Sort):
  • 思想:将数组视为一个二叉堆,利用堆的性质将最大(或最小)的元素放到堆的最后,然后重新调整堆,重复这个过程直到整个数组有序。
  • 时间复杂度:始终为O(n log n),且不依赖于输入数据的初始状态。
void heapify(int arr[], int size, int i) {int largest = i;int left = 2 * i + 1;int right = 2 * i + 2;if (left < size && arr[left] > arr[largest])largest = left;if (right < size && arr[right] > arr[largest])largest = right;if (largest != i) {std::swap(arr[i], arr[largest]);heapify(arr, size, largest);}
}void heapSort(int arr[], int size) {for (int i = size / 2 - 1; i >= 0; i--)heapify(arr, size, i);for (int i = size - 1; i >= 0; i--) {std::swap(arr[0], arr[i]);heapify(arr, i, 0);}
}
  1. 计数排序(Counting Sort):
  • 思想:适用于一定范围内的整数排序,通过统计每个元素的出现次数,然后根据统计信息进行排序。
  • 时间复杂度:最好情况为O(n+k),其中k为数据范围,但不适用于负数和浮点数。
void countingSort(int arr[], int size) {int max = arr[0], min = arr[0];for (int i = 1; i < size; i++) {if (arr[i] > max)max = arr[i];if (arr[i] < min)min = arr[i];}int range = max - min + 1;int* count = new int[range]();int* output = new int[size];for (int i = 0; i < size; i++)count[arr[i] - min]++;for (int i = 1; i < range; i++)count[i] += count[i - 1];for (int i = size - 1; i >= 0; i--) {output[count[arr[i] - min] - 1] = arr[i];count[arr[i] - min]--;}for (int i = 0; i < size; i++)arr[i] = output[i];delete[] count;delete[] output;
}
  1. 桶排序(Bucket Sort):
  • 思想:将数据分到有限数量的桶里,每个桶再分别进行排序。
  • 时间复杂度:取决于桶的数量和桶内部排序的算法,通常为O(n+k),其中k为桶的数量。
void bucketSort(int arr[], int size) {const int max = *std::max_element(arr, arr + size);const int min = *std::min_element(arr, arr + size);const int range = max - min + 1;std::vector<std::vector<int>> buckets(range);for (int i = 0; i < size; i++) {int index = (arr[i] - min) * range / (max - min + 1);buckets[index].push_back(arr[i]);}int idx = 0;for (int i = 0; i < range; i++) {std::sort(buckets[i].begin(), buckets[i].end());for (int j = 0; j < buckets[i].size(); j++) {arr[idx++] = buckets[i][j];}}
}
  1. 基数排序(Radix Sort):
  • 思想:将数据按位数进行排序,从最低位开始依次进行排序,直到最高位。
  • 时间复杂度:O(n*k),其中n为元素数量,k为元素的位数。
int getMax(int arr[], int size) {int max = arr[0];for (int i = 1; i < size; i++) {if (arr[i] > max)max = arr[i];}return max;
}void countSort(int arr[], int size, int exp) {int output[size];int count[10] = {0};for (int i = 0; i < size; i++)count[(arr[i] / exp) % 10]++;for (int i = 1; i < 10; i++)count[i] += count[i - 1];for (int i = size - 1; i >= 0; i--) {output[count[(arr[i] / exp) % 10] - 1] = arr[i];count[(arr[i] / exp) % 10]--;}for (int i = 0; i < size; i++)arr[i] = output[i];
}void radixSort(int arr[], int size) {int max = getMax(arr, size);for (int exp = 1; max / exp > 0; exp *= 10)countSort(arr, size, exp);
}

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

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

相关文章

CentOS安装kafka单机部署

一&#xff1a;保证机器上已经运行的有Java环境 服务器&#xff1a;centos7 kafka版本&#xff1a;3.5.1 二&#xff1a;下载kafka压缩包 下载地址 1.解压kafka压缩包 tar -zxvf kafka_2.13-3.5.1.tgz 2.我得是上传到了 /home目录下&#xff0c;配置文件server.propertie…

UE5 ChaosVehicles载具研究

一、基本组成 载具Actor类名称&#xff1a;WheeledVehiclePawn Actor最原始的结构 官方增加了两个摇臂相机&#xff0c;可以像驾驶游戏那样切换多机位、旋转观察 选择骨骼网格体、动画蓝图类、开启物理模拟 二、SportsCar_Pawn 角阻尼&#xff1a;物体旋转的阻力。数值越大…

云原生技术盛会KubeCon即将召开!亚马逊云科技作为钻石赞助商参会

KubeCon2023将于9月26-28日在上海跨国采购会展中心隆重召开。作为云原生领域最负盛名的技术大会之一&#xff0c;KubeConCloudNativeCon是连接全球开发者与云原生社区的最佳平台&#xff0c;此次还新增Open Source Summit环节&#xff0c;吸引了全球顶尖的云原生专家们汇聚其中…

ArrayBlockingQueue

ArrayBlockingQueue 是 一个并发队列实现,它基于数组的数据结构,提供了线程安全的队列操作。这个队列的容量是固定的,一旦达到容量上限,后续的插入操作将会被阻塞,直到有其他线程从队列中移除元素为止。以下是对 ArrayBlockingQueue 的详细解释: 容量限制:ArrayBlocking…

腾讯mini项目-【指标监控服务重构-会议记录】2023-08-04

组长会议记录 A组 调研 traefik 命名&#xff0c;大驼峰 Grafana metric 的配置还存在有些问题&#xff0c;待解决 完成了 trace 的上报 待办&#xff1a; entry.go : fiber log 重复 【完成】event.go : traceparent 变量&#xff0c;线程隔离&#xff0c;多线程并发问题…

数据链路层协议

文章目录 数据链路层协议0. 数据链路层解决的问题1. 以太网协议(1) 认识以太网(2) 以太网帧格式<1> 两个核心问题 (3) 认识MAC地址(4) 局域网通信原理(5) MTU<1> 认识MTU<2> MTU对IP协议的影响<3> MTU对UDP协议的影响<4> MTU对TCP协议的影响<…

Python开发与应用实验2 | Python基础语法应用

*本文是博主对学校专业课Python各种实验的再整理与详解&#xff0c;除了代码部分和解析部分&#xff0c;一些题目还增加了拓展部分&#xff08;⭐&#xff09;。拓展部分不是实验报告中原有的内容&#xff0c;而是博主本人自己的补充&#xff0c;以方便大家额外学习、参考。 &a…

Oracle判断函数

CASE WHEN 语法&#xff1a; CASE WHEN 条件1 THEN 返回值1WHEN 条件2 THEN 返回值2ELSE 默认值END -- 对 EMP 的 DEPTNO 字段进行判断,显示出对应的部门名称 SELECT E.*, CASE WHEN E.DEPTNO10 THEN ACCOUNTINGWHEN E.DEPTNO20 THEN RESEARCHWHEN E.DEPTNO30 THEN SALES…

安装Python3.x--Windows

1 下载安装包 确定安装是干什么&#xff0c;要下哪个版本&#xff08;如果是配置项目环境&#xff0c;最好按项目需求的版本来装&#xff09; 1.1 官网链接 https://www.python.org 最新版本 指定版本 2 安装说明 点击下载exe&#xff0c;运行自定义安装路径&#xff0c;下…

什么是泛型?

泛型&#xff08;Generics&#xff09;是一种编程语言特性&#xff0c;它允许在编写代码时使用未指定具体类型的变量、参数或返回值。泛型的作用是增加代码的灵活性和重用性&#xff0c;并提高代码的类型安全性。 泛型可以应用于各种数据结构和算法中&#xff0c;例如集合类&a…

TS编译选项——不允许使用隐式any类型、不明确类型的this、严格检查空值、编译后文件自动设置严格模式

一、不允许使用隐式any类型 在tsconfig.js文件中配置noImplicitAny属性 {"compilerOptions": {// 不允许使用隐式any类型"noImplicitAny": true} } 开启后即可禁止使用隐式的any类型 注意&#xff1a;显式的any类型并不会被禁止 二、不允许使用不明确类…

腾讯mini项目-【指标监控服务重构】2023-08-26

今日已办 Venus 的 Trace 无感化 定义 handler 函数 fiber.Handler 的主要处理逻辑返回处理中出现的 error返回处理中响应 json 的函数 // handler // Description: // Author xzx 2023-08-26 18:00:03 // Param c // Return error // Return func() error : function for …

和 Node.js 说拜拜,Deno零配置解决方案

不知道大家注意没有&#xff0c;在我们启动各种类型的 Node repo 时&#xff0c;root 目录很快就会被配置文件塞满。例如&#xff0c;在最新版本的 Next.js 中&#xff0c;我们就有 next.config.js、eslintrc.json、tsconfig.json 和 package.json。而在样式那边&#xff0c;还…

Spring面试题9:Spring的BeanFactory和FactoryBean的区别和联系

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:说一说Spring的BeanFactory和FactoryBean的区别和联系 区别:BeanFactory是一个工厂接口,主要负责管理和创建Bean实例。它是Spring提供的最底层的…

优维产品最佳实践:主机合规性检查

我们常常会感到这样的困惑&#xff0c;为什么这么多的无效主机记录&#xff0c;为什么这些主机很多信息空白&#xff0c;当许多人一起维护主机信息时&#xff0c;常常会出现信息错漏的情况。主机是运维最重要最基本的CMDB信息&#xff0c;而「合规性检查」为我们提供了更高效便…

Spring Cloud Alibaba Gateway 简单使用

文章目录 Spring Cloud Alibaba Gateway1.Gateway简介2. 流量网关和服务网关的区别3. Spring Cloud Gateway 网关的搭建3.1 Spring Cloud Gateway 配置项的说明3.2 依赖导入3.3 配置文件 Spring Cloud Alibaba Gateway 1.Gateway简介 Spring Cloud Gateway是一个基于Spring F…

linux之df命令 查看分区大小

linux命令df linux命令&#xff1a;检查文件系统的磁盘空间占用情况。 格式&#xff1a;df [选项] 说明&#xff1a;df命令可显示所有文件系统对I节点和磁盘块的使用情况。 命令中各个选项的含义&#xff1a; df -a&#xff1a;显示所有文件系统的磁盘使用情况&#xff0c;包括…

混合Rollup:探秘 Metis、Fraxchain、Aztec、Miden和Ola

1. 引言 混合Rollup为新的以太坊L2扩容方案&#xff0c;其分为2大类&#xff1a; 将乐观与ZK技术结合的混合Rollup同时支持公开智能合约 和 私人智能合约 的混合Rollup 本文将重点关注Metis、Fraxchain、Aztec、Miden和Ola这五大项目。 2. 何为混合Rollup&#xff1f; 混合…

MySQL-树型结构数据查询

表结构 进行树形结构查询&#xff0c;利用特殊语法进行操作 with recursive t as(select parent_id , business_namefrom business_line where id 21union allselect a.parent_id, a.business_namefrom business_line a join t on a.id t.parent_id) select business_name f…

[AI Agent学习] MetaGPT源码浅析

前言 工作上&#xff0c;需要使用AI Agent&#xff0c;所以需要深入学习一下AI Agent&#xff0c;光阅读各种文章&#xff0c;总觉无法深入细节&#xff0c;所以开看各类AI Agent相关的开源项目&#xff0c;此为第一篇&#xff0c;学习一下MetaGPT的源码。 基本目标 MetaGPT是一…