《C语言实现各种排序算法》

文章目录

    • 一、排序
        • 1、排序的各种方式分类
    • 二、插入排序
        • 1、直接插入排序
        • 2、希尔排序
        • 3、希尔排序时间复杂度分析
    • 三、选择排序
        • 1、直接选择排序
        • 2、堆排序
    • 四、交换排序
        • 1、冒泡排序
        • 2、快速排序

一、排序

在生活中各种场景中都会有排序的身影存在,在网购时会有价格排序,在学校中会有程序排序,在游戏中会有段位的排序等。

1、排序的各种方式分类

在这里插入图片描述

这些排序的效率各有不同

二、插入排序

直接插⼊排序是⼀种简单的插⼊排序法,其基本思想是:把待排序的记录按其关键码值的⼤⼩逐个插⼊到⼀个已经排好序的有序序列中,直到所有的记录插⼊完为⽌,得到⼀个新的有序序列 。

1、直接插入排序

当插⼊第 i(i>=1) 个元素时,前⾯的 array[0],array[1],…,array[i-1] 已经排好序,此时⽤ array[i] 的排序码与 array[i-1],array[i-2],… 的排序码顺序进⾏⽐较,找到插⼊位置即将 array[i] 插⼊,原来位置上的元素顺序后移

代码实现:

void InsertionSort(int* arr, int n)
{int i = 0;int j = 0;for ( i = 1; i < n; i++){j = i-1;int tmp = arr[i];while (j >= 0){if (arr[j] < tmp){arr[j + 1] = arr[j];j--;}else{break;}}arr[j + 1] = tmp;}
}
2、希尔排序

直接插入排序效率不高,在直接插入排序的基础上进行优化,改进,把一个大的集合分为若干个小的集合再进行直接插入排序,从而提升效率。
希尔排序法⼜称缩⼩增量法。希尔排序法的基本思想是:先选定⼀个整数(通常是gap = n/3+1),把待排序⽂件所有记录分成各组,所有的距离相等的记录分在同⼀组内,并对每⼀组内的记录进⾏排序,然后gap=gap/3+1得到下⼀个整数,再将数组分成各组,进⾏插⼊排序,当gap=1时,就相当于直接插⼊排序。

代码实现:

void ShellSort(int* arr, int n)
{int gec = n;int i, j = 0;while (gec > 1){gec = gec / 3 + 1;for (i = gec; i < n; i++){j = i - gec;int tmp = arr[i];while (j >= 0){if (arr[j] < tmp){arr[j + gec] = arr[j];j -= gec;}else{break;}}arr[j + gec] = tmp;}}
}
3、希尔排序时间复杂度分析

外层循环的时间复杂度可以直接给出为: O(log2 n) 或者 O(log3 n) ,即 O(log n)
内层循环

在这里插入图片描述
在这里插入图片描述

希尔排序的时间复杂度大约为 log ⁡ 2 n 1.3 \log_2 {n^{1.3}} log2n1.3

三、选择排序

每⼀次从待排序的数据元素中选出最⼩(或最⼤)的⼀个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。

1、直接选择排序
void SelectSort(int* a, int n)
{int begin = 0, end = n - 1;while (begin < end){int max = begin, min = begin;for (int i = begin + 1; i <= end; i++){if (a[i] < a[min]){min = i;}if (a[i] > a[max]){max = i;}}if (max == begin){max = min;}{int tmp = a[min];a[min] = a[begin];a[begin] = tmp;}{int tmp = a[max];a[max] = a[end];a[end] = tmp;}begin++;end--;}
}
2、堆排序
void HeapSort(int* arr, int n)
{int i = 0;for (i = (n-1)/2; i>=0; i--){int parent = i;int child = parent * 2 + 1;while (child <= i){if (child + 1 <= i && arr[child + 1] < arr[child]){child++;}if (arr[child] < arr[parent]){int tmp = arr[parent];arr[parent] = arr[child];arr[child] = tmp;parent = child;child = parent * 2 + 1;}else{break;}}}for (i = n - 1; i > 0; i--){int child = i;int parent = 0;int tmp = arr[parent];arr[parent] = arr[child];arr[child] = tmp;child = parent * 2 + 1;while (child < i){if (child + 1 < i && arr[child + 1] < arr[child]){child++;}if (arr[child] < arr[parent]){tmp = arr[parent];arr[parent] = arr[child];arr[child] = tmp;parent = child;child = parent * 2 + 1;}else{break;}}}
}

堆排序的时间复杂度为n log ⁡ n \log n logn

四、交换排序

1、冒泡排序
void BubbleSort(int* a, int n)
{for (int i = 0; i < n - 1; i++){int falg = 1;for (int j = 0; j < n - 1 - i; j++){if (a[j] > a[j + 1]){int tmp = a[j];a[j] = a[j + 1];a[j + 1] = tmp;falg = 0;}}if (falg){break;}}
}
2、快速排序

通过找基准值,基准值的位置就是这个值该待的位置,然后递归找基准值左边区间和右区间,直到区间不成立位置,确定每个值该待的位置完成排序。

int _QuickSort(int* a, int left, int right)
{int keyi = left;left++;while (left <= right){while (left <= right && a[left] < a[keyi]){left++;}while (left <= right && a[right] > a[keyi]){right--;}if (left <= right){int tmp = a[left];a[left] = a[right];a[right] = tmp;left++;right--;}}int tmp = a[keyi];a[keyi] = a[right];a[right] = tmp;return right;
}void QuickSort(int* a, int left,int right)
{if (left >= right){return;}int keyi = _QuickSort(a, left, right);QuickSort(a, keyi + 1, right);QuickSort(a, left, keyi - 1);}

快排的空间复杂度:O( l o n g n long n longn)
快排的时间复杂度:O(n l o n g n long n longn)

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

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

相关文章

Apache Nifi挂接MQTT与Kafka实践

目录 1. 说明&#xff1a; 2. 方案设计&#xff1a; 2.1 资源配置&#xff1a; 2.2 交互Topics: 3. 实现步骤 3.1 Nifi 桌面 3.2 MqttToKafka 3.2.1 配置 3.2.2 测试 3.2.3 结果 3.3 KafkaToMqtt 3.3.1 配置 3.3.1 测试 3.3.1 结果 ​编辑 4. 总结&#xff…

Mysql的RedoLog、BingLog、UndoLog

UndoLog undo log 是一种用于撤销回退的日志。在事务没提交之前&#xff0c;MySQL 会先记录更新前的数据到 undo log 日志文件里面&#xff0c;当事务回滚时&#xff0c;可以利用 undo log 来进行回滚。 每当 InnoDB 引擎对一条记录进行操作&#xff08;修改、删除、新增&#…

vue3 命令运行窗口暴露网络地址,以及修改端口号

一般情况下这里的地址是隐藏的 这里加上 --host 可以暴露网络地址&#xff0c;再加上--port --8080 就可以将端口号修改为8080&#xff08;修改后边的数字就可以修改为你想要的端口号&#xff09;

物联网时代下的5G融合定位,可以实现哪些功能?

5G具有高带宽、高频谱&#xff08;毫米波&#xff09;、多天线阵列等特性&#xff0c;通过提升无线定位算法的能力、室内数字系统建设、完善5G定位服务流程以及与其它定位技术和平台的结合&#xff0c;可提高5G定位精度。室内高精度定位服务为5G定位扩展到更多应用场景和领域构…

JVM:垃圾回收器演进

文章目录 一、演进二、Shenandoah三、ZGC 一、演进 二、Shenandoah Shenandoah是由Red Hat开发的一款低延迟的垃圾收集器&#xff0c;Shenandoah并发执行大部分GC工作&#xff0c;包括并发的整理&#xff0c;堆大小对STW的时间基本没有影响。 三、ZGC ZGC是一种可扩展的低延…

算法——滑动窗口(day8)

30.串联所有单词的子串 30. 串联所有单词的子串 - 力扣&#xff08;LeetCode&#xff09; 必看&#xff01;&#xff01;&#xff01;本题是我们上次写的438.异位词的进阶版&#xff0c;可参考本篇文章&#xff1a;算法——滑动窗口&#xff08;day7&#xff09;-CSDN博客来…

【SOLUTION】Spring Boot 集成 WebSocket

1. Maven 依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dependency>2. 注册ServerEndpointExporter、WebSocketConfigProperties WebSocketConfigProperties…

W30-python01-Selenium Web自动化基础--百度搜索案例-chrome浏览器为例

原理图 一、下载webdriver--chrome浏览器 根据本机浏览器的版本号下载对应的webdriver版本 http://chromedriver.storage.googleapis.com/index.html 二、安装selenium库 pip install selenium -i Simple Index 三、第一个Web自动化脚本 selenium实现Web自动化的基本步骤&…

【Qt 】JSON 数据格式详解

文章目录 1. JSON 有什么作用?2. JSON 的特点3. JSON 的两种数据格式3.1 JSON 数组3.2 JSON 对象 4. Qt 中如何使用 JSON 呢&#xff1f;4.1 QJsonObject4.2 QJsonArray4.3 QJsonValue4.4 QJsonDocument 5. 构建 JSON 字符串6. 解析 JSON 字符串 1. JSON 有什么作用? &#x…

1、hadoop环境搭建

1、环境配置 ip(/etc/sysconfig/network-scripts) # 网卡1 DEVICEeht0 TYPEEthernet ONBOOTyes NM_CONTROLLEDyes BOOTPROTOstatic IPADDR192.168.59.11 GATEWAY192.168.59.1 NETMASK 255.255.255.0 # 网卡2 DEVICEeht0 TYPEEthernet ONBOOTyes NM_CONTROLLEDyes BOOTPROTOdh…

算法通关:006_3二分查找:查找数组中<=num 最右边的值

文章目录 说明主要代码全部代码运行结果 说明 大于等于最右不考&#xff0c;意义不大。 直接看&#xff08;arr.length-1&#xff09; 位&#xff08;即数组最后一位&#xff09;&#xff0c;如果大于num&#xff0c;那就说明arr[arr.length-1]是大于等于最右的数字数组最后一…

Redux +Toolkit 工具包快速入门

您将学到什么 如何设置并使用 Redux Toolkit 和 React-Redux 先决条件 熟悉ES6 语法和功能了解 React 术语&#xff1a;JSX、State、Function Components 、 Props和Hooks理解Redux 术语和概念 1、基本使用 1.1、安装 Redux Toolkit 和 React- Redux 将 Redux Toolkit 和 Rea…

学习C语言第十四天(指针练习)

1.第一题C 2.第二题C 3.第三题 00345 short类型解引用一次访问两个字节 4.第四题 6&#xff0c;12 5.第五题C 6.第六题 下面代码结果是0x11223300 7.第七题 int main() {int a 0;int n 0;scanf("%d %d",&a,&n);int i 0;int k 0;int sum 0;for (i 0;…

sklearn聚类算法用于图片压缩与图片颜色直方图分类

上期文章:机器学习之SKlearn(scikit-learn)的K-means聚类算法 我们分享了sklearn的基本知识与基本的聚类算法,这里主要是机器学习的算法思想,前期文章我们也分享过人工智能的深度学习,二者有如何区别,可以先参考如下几个实例来看看机器学习是如何操作的 不同K值下的聚…

算法解决海量数据的 topK

目录 设计算法解决海量数据的 topK 问题如何统计不同电话号码的个数&#xff1f;题目描述解答思路与实现步骤注意点 如何在大量的数据中判断一个数是否存在&#xff1f;题目描述解决方案具体步骤优化与注意事项 如何从大量的 URL 中找出相同的 URL&#xff1f;题目描述解答思路…

系统架构设计师教程 第4章 信息安全技术基础知识-4.5 密钥管理技术4.6 访问控制及数字签名技术-解读

系统架构设计师教程 第4章 信息安全技术基础知识-4.5 密钥管理技术&4.6 访问控制及数字签名技术 4.5 密钥管理技术4.5.1 对称密钥的分配与管理4.5.1.1 密钥的使用控制4.5.1.1.1 密钥标签4.5.1.1.2 控制矢量4.5.1.2 密钥的分配4.5.1.2.1物理方式14.5.1.2.2 物理方式24.5.1…

【多线程】定时器

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. 定时器是什么&#xff1f;2. 定时器的应用场景3. Timer类的使用3.1 Timer类创建定时器3.2 schedule()方法…

C语言——结构体(struct)对齐

目录 前言 一、结构体对齐规则 1、结构体的总大小对齐规则 2、结构体成员的对齐规则 3、数组和结构体的对齐规则 二、改变编译器对齐数&#xff08;#pragma pack&#xff09; 三、如何减小结构体占用内存 1、 重新排列成员顺序 2、使用#pragma pack指令 3、使用位域 4、其他 总…

使用sheetjs导出CSV文本为excel

使用SheetJS&#xff08;也称为xlsx库&#xff09;导出CSV文本为Excel文件&#xff0c;你可以先将CSV文本解析为SheetJS支持的工作表格式&#xff0c;然后再将其写入为一个新的Excel文件。以下是一个简单的示例代码&#xff1a; const XLSX require(xlsx); const fs requir…

.net core 8.0 新建的项目无法使用 IApplicationBuilder

1、在项目文件中添加 <ItemGroup><FrameworkReference Include"Microsoft.AspNetCore.App" /> </ItemGroup> 2、在使用的地方添加 using Microsoft.AspNetCore.Builder;