数据结构排序

目录

1、插入排序

2、希尔排序

3、堆排序

4、直接选择排序

5、快排

6、归并排序

补:计数排序


1、插入排序

void InsertSort(int* arr, int n)
{int i = 0;for (int i = 0; i + 1 < n; i++){int end = i;int tmp = arr[end + 1];while (end >= 0){if (arr[end] > tmp){arr[end + 1] = arr[end];end--;}else{break;}}arr[end + 1] = tmp;}}

 另一种写法

INSERTION-SORT

源码

for j=2 to A.legthkey=A[j]i=j-1whlie i>0 and A[i]>keyA[i+1]=A[i]i=i-1A[i+1]=key

插入排序

比方说手上有6张扑克牌-5 2 4 6 1 3通过插入排序

即从j=2开始(key=2)比较key与A[i] (i=j-1也就是2这张牌的前一张牌5比较)并完成交换数值

把第一张key排好后j++=3再来循环

c语言实现

#include<stdio.h>int main()
{int j ;int arr[6] = { 5,2,4,6,1,3 };int sz = sizeof(arr) / sizeof(arr[0]);for (j=1; j < sz; j++){int key = arr[j];int i = j - 1;  //arr[i]>arr[j]不行吗while (i >=0 && arr[i] > key)//升序排列{arr[i + 1] = arr[i];//为什么不能写成arr[j]=arr[i]i = i - 1;}arr[i + 1] = key;}return 0;
}
  1. arr[i]比较的是key的值,而不是arr[j]的值,因为arr[j]在while循环中会改变
  2. 同理

2、希尔排序

希尔排序法⼜称缩⼩增量法。希尔排序法的基本思想是:先选定⼀个整数(通常是gap=n/3+1),把 待排序⽂件所有记录分成各组,所有的距离相等的记录分在同⼀组内,并对每⼀组内的记录进⾏排 序,然后gap=gap/3+1得到下⼀个整数,再将数组分成各组,进⾏插⼊排序,当gap=1时,就相当于 直接插⼊排序。它是在直接插⼊排序算法的基础上进⾏改进⽽来的,综合来说它的效率肯定是要⾼于直接插⼊排序算法的。

每一组的排序都是插入排序

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

完整代码

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

3、堆排序

void AdjustDown(DataType* arr, int parent, int n)
{int child = 2 * parent + 1;while (child < n){if (child + 1 < n && arr[child] < arr[child + 1]){child++;}if (arr[child] > arr[parent]){Swap(&arr[child], &arr[parent]);parent = child;child = 2 * child + 1;}else{break;}}
}void HeapSort(int* arr, int n)
{int i = 0;//用向下调整算法建堆//循环从下至上for (i = (n - 1 - 1) / 2; i >= 0; i--){AdjustDown(arr, i, n);}int end = n - 1;while (end > 0){Swap(&arr[0], &arr[end]);AdjustDown(arr, 0, end);end--;}}

4、直接选择排序

未优化

void SelectSort1(int* arr, int n)
{int mini;for (int i = 0; i < n - 1; i++){mini = i;for (int j = i + 1; j < n; j++){if (arr[j] < arr[mini]){mini = j;}}Swap(&arr[i], &arr[mini]);}
}

优化

void SelectSort(int* arr, int n)
{int begin = 0;int end = n - 1;while (begin < end){int maxi = begin, mini = begin;for (int i = begin + 1; i <= end; i++){if (arr[i] > arr[maxi]){maxi = i;}if (arr[i] < arr[mini]){mini = i;}}if (begin == maxi){maxi = mini;}Swap(&arr[begin], &arr[mini]);Swap(&arr[end], &arr[maxi]);++begin;--end;}}

5、快排

快速排序是Hoare于1962年提出的⼀种⼆叉树结构的交换排序⽅法,其基本思想为:任取待排序元素 序列中的某元素作为基准值,按照该排序码将待排序集合分割成两⼦序列,左⼦序列中所有元素均⼩ 于基准值,右⼦序列中所有元素均⼤于基准值,然后最左右⼦序列重复该过程,直到所有元素都排列 在相应位置上为⽌。

int _QuickSort(int* arr, int left, int right)
{//left从左往右找比基准值大的数据//right从右往左找比基准值小的数据int keyi = left;left++;while (left <= right){while (left <= right &&arr[left] < arr[keyi]){left++;}//left找到了最大位置while (left <= right &&arr[right] > arr[keyi]){right--;}if (left <= right){Swap(&arr[left++], &arr[right--]);}}Swap(&arr[keyi], &arr[right]);return right;
}//双指针法
int _QuickSort3(int* arr, int left, int right)
{int key = left, slow = left, fast = left + 1;while (fast <= right){if (arr[fast] < arr[key] && ++slow != fast){Swap(&arr[slow], &arr[fast]);}fast++;}Swap(&arr[key], &arr[slow]);return slow;
}void QuickSort(int* arr, int left, int right)
{if (left >= right){return;}int keyi= _QuickSort(arr, left, right);QuickSort(arr, left,keyi-1);QuickSort(arr, keyi+1, right);}

6、归并排序

void _MergeSort(int* arr,int left,int right,int* tmp)
{if (left >= right){return;}int mid = (left + right) / 2;//[left,mid] [mid+1,right]_MergeSort(arr, left, mid, tmp);_MergeSort(arr, mid + 1, right, tmp);//合并//[left,mid] [mid+1,right]int begin1 = left, end1 = mid;int begin2 = mid + 1, end2 = right;int index = begin1;while (begin1 <= end1 && begin2 <= end2){if (arr[begin1] < arr[begin2]){tmp[index++] = arr[begin1++];}else {tmp[index++] = arr[begin2++];}}//要么begin1越界  要么begin2越界while (begin1 <= end1){tmp[index++] = arr[begin1++];}while (begin2 <= end2){tmp[index++] = arr[begin2++];}//[left,mid] [mid+1,right]//把tmp中的数据拷贝回arr中for (int i = left; i < right; i++){arr[i] = tmp[i];}
}void MergeSort(int* arr, int n)
{int* tmp = (int*)malloc(sizeof(int) * n);_MergeSort(arr, 0, n - 1, tmp);free(tmp);
}

补:计数排序

计数排序⼜称为鸽巢原理,是对哈希直接定址法的变形应⽤。操作步骤:

1)统计相同元素出现次数

2)根据统计的结果将序列回收到原来的序列中

void CountSort(int* arr, int n)
{int max = arr[0], min = arr[0];for (int i = 0; i < n; i++){if (arr[i] > max){max = arr[i];}if (arr[i] < min){min = arr[i];}}int range = max - min + 1;int* count = (int*)malloc(sizeof(int) * range);if (count == NULL){perror("malloc fail:");exit(1);}memset(count, 0, sizeof(int) * range);for (int i = 0; i < n; i++){count[arr[i] - min]++;}int index = 0;for (int i = 0; i < range; i++){while (count[i]--){arr[index++] = i + min;}}
}

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

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

相关文章

Spring声明式事务生效是有条件滴!

在日常工作中&#xff0c;经常使用Transactional 注解进行事务的声明&#xff0c;但如果发现事务未生效&#xff0c;可以从下面几个方面进行排查。 常见失效场景总结 场景原因解决方案内部方法调用绕过了Spring代理注入自身或使用AopContextprivate方法AOP无法增强改为public方…

Code Composer Studio快捷键

文本编辑 编辑、查找、替换功能快捷键 功能快捷键撤销CutZ重做CutY剪切CtrlX复制CtrlC粘贴CtrlV删除Delete全选CtrlA代码块选中AltShiftA查找、替换Ctrl F查找下一个匹配的字符串CtrlK查找上一个匹配的字符串CtrlShiftK查看接口注释&#xff08;文档&#xff09;F2查看函数帮…

从认识AI开始-----生成对抗网络(GAN):通过博弈机制,引导生成

前言 生成对抗网络&#xff08;GAN&#xff09;是lan J. Goodfellow团队在2014年提出的生成架构&#xff0c; 该架构自诞生起&#xff0c;就产生了很多的话题&#xff0c;更是被称为生成对抗网络是“新世纪以来机器学习领域内最有趣的想法”。如今&#xff0c;基于生成对抗网络…

限流算法java实现

参考教程&#xff1a;2小时吃透4种分布式限流算法 1.计数器限流 public class CounterLimiter {// 开始时间private static long startTime System.currentTimeMillis();// 时间间隔&#xff0c;单位为msprivate long interval 1000L;// 限制访问次数private int limitCount…

Maven 构建性能优化深度剖析:原理、策略与实践

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

JS手写代码篇---手写深拷贝

17、深拷贝 深拷贝与浅拷贝最大的不同就是对象的属性是嵌套对象&#xff0c;会新建一个对象 步骤&#xff1a; 判断是否为对象判断是否为i数组或者对象&#xff0c;给新的有个容器遍历循环&#xff0c;如果是对象要遍历循环&#xff0c;采用递归 function deepCopy(obj){// …

【react实战】如何实现监听窗口大小变化

在日常开发场景中&#xff0c;监听窗口变化是一个比较常见又很重要的业务功能&#xff0c;其实实现起来也很简单&#xff0c;今天就来记录一下具体的实现以及注意事项。 实现思路 在 React 中&#xff0c;可以通过监听 window 的 resize 事件来检测可视区域&#xff08;viewp…

AVCap视频处理成帧和音频脚本

###############处理原视频&#xff0c;使其格式和原数据一样 import os import cv2 import subprocess import json from PIL import Image from pydub import AudioSegmentimport sys import shutil # &#x1f539; 第一步&#xff1a;强制检测并设置FFmpeg路径 &#x1f5…

数据冗余对企业运营的隐性成本

从客户管理到供应链优化&#xff0c;再到市场分析&#xff0c;数据无处不在&#xff0c;数据已成为企业运营的核心驱动力。然而&#xff0c;随着企业IT系统的多样化和数据量的激增&#xff0c;数据冗余&#xff08;Data Redundancy&#xff09;问题逐渐浮出水面&#xff0c;成为…

HTML原生日期插件增加周次显示

<div id="app" class="box box-info" style="border-top-color:white;"><!-- // 日期部分 --><div class="date-picker-container" style="position: relative; max-width: 200px;"><!-- 日期输入框 -…

渗透测试PortSwigger Labs:遭遇html编码和转义符的反射型XSS

1 处是我们输入的标签被服务器 html 编码后返回&#xff0c;被浏览器当作字符串显示出来&#xff0c;无法执行 javascript 2 处是唯一能控制的地方&#xff0c;正好在script标签范围内&#xff0c;可以尝试构造 依然存在转移单引号&#xff0c;我们输入转义符\让服务器添加的转…

Ansible 错误处理:确保高效自动化

当 Ansible 收到命令的非零返回码或模块故障时,默认情况下,它会停止在该主机上的执行,并在其他主机上继续执行。但是,在某些情况下,您可能需要不同的行为。有时非零返回码表示成功。有时您希望一台主机上的故障导致所有主机上的执行停止。Ansible 提供了处理这些情况的工具…

【无标题】NP完全问题的拓扑对偶统一解法 ——四色问题到P=NP的普适框架

NP完全问题的拓扑对偶统一解法 ——四色问题到PNP的普适框架 **摘要** 本文提出基于**拓扑膨胀-收缩对偶性**的计算理论框架&#xff0c;突破传统NP完全性理论局限。通过将离散组合问题转化为连续几何问题&#xff0c;并引入规范场量子求解机制&#xff0c;实现四色问题、子…

【Zephyr 系列 19】打造 BLE 模块完整 SDK:AT 命令系统 + 状态机 + NVS + OTA 一体化构建

🧠关键词:Zephyr、BLE 模块、SDK 构建、AT 命令框架、有限状态机、Flash 配置、MCUboot OTA 📌面向读者:希望将 BLE 项目标准化、封装化、支持量产使用的开发团队与架构师 📊预计字数:5500+ 字 🧭 背景与目标 在完成多个 BLE 功能模块后,一个企业级产品往往需要:…

机器学习核心概念速览

机器学习基本概念 有监督学习分类、回归无监督学习聚类、降维 一维数组 import numpy as np data np.array([1,2,3,4,5]) print(data) print(data.shape) print(len(data.shape))[1 2 3 4 5] (5,) 1二维数组 data2 np.array([[1,2,3],[4,5,6]]) print(data2) print(data2…

在 Java 中实现一个标准 Service 接口,并通过配置动态选择具体实现类供 Controller 调用

在 Java 中实现一个标准 Service 接口&#xff0c;并通过配置动态选择具体实现类供 Controller 调用&#xff0c;是解耦和灵活扩展的常见设计模式。 需求分析 当你需要开发一个需要灵活切换业务实现的系统&#xff0c;比如不同环境使用不同策略&#xff08;如测试环境用Mock实…

input+disabled/readonly问题

背景&#xff1a; vue2elementui <el-input v-model"inputForm.projectName" class"input-font" :disabled"projectDisabled" placeholder"请选择" :readonly"isReadonly"><el-button slot"append"…

Office2019下载安装教程(2025最新永久方法)(附安装包)

文章目录 Office2019安装包下载Office2019一键安装步骤&#xff08;超详细&#xff01;&#xff09; 大家好&#xff01;今天给大家带来一篇超实用的Office2019专业版安装教程&#xff01;作为日常办公和学习的必备软件&#xff0c;Office的安装对很多朋友来说可能有点复杂&…

【编译工具】(版本控制)Git + GitHub Actions:自动化工作流如何让我的开发效率提升200%?

目录 引言&#xff1a;现代开发中版本控制和 CI/CD 的重要性 一、Git&#xff1a;为什么它是版本控制的首选&#xff1f; &#xff08;1&#xff09;Git 的核心优势 &#xff08;2&#xff09;Git 高效工作流示例 ① 功能开发流程 ② 紧急修复流程 二、GitHub Acti…

码蹄杯真题分享

我的个人主页 我的专栏&#xff1a; 人工智能领域、java-数据结构、Javase、C语言&#xff0c;MySQL&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01; 点赞&#x1f44d;收藏❤ 1&#xff1a;房间打扫&#xff08;题目链接&#xff09; 思路&#xff1a;要想…