C语言数据结构排序、插入排序、希尔排序(多组并排、一组排完排另一组)、选择排序、堆排序、冒泡排序等的介绍

文章目录

  • 前言
  • 打印数组函数
  • 一、插入排序
  • 二、希尔排序
  • 三、选择排序
  • 四、堆排序
  • 五、冒泡排序
  • 总结

前言

C语言数据结构排序、插入排序、希尔排序(多组并排、一组排完排另一组)、选择排序、堆排序、冒泡排序等的介绍


打印数组函数

打印数组函数定义

// 打印数组
void PrintArray(int* a, int n)
{int i = 0;for (i = 0; i < n; i++){printf("%d ", a[i]);}printf("\n");
}

一、插入排序

插入排序定义

// 插入排序------升序
void InsertSort(int* a, int n)
{int i = 0;for (i = 1; i < n; i++){int end = i - 1;int tmp = a[end + 1];while (end >= 0){if (tmp < a[end]){a[end + 1] = a[end];end--;}else{break;}}a[end + 1] = tmp;}
}

插入排序测试

void TestInsertSort()
{int a[] = { 9, 6, 5, 7, 3, 1, 4, 2, 8, 0 };int sz = sizeof(a) / sizeof(a[0]);PrintArray(a, sz);InsertSort(a, sz);PrintArray(a, sz);
}

效果如下:
在这里插入图片描述

二、希尔排序

  • 希尔排序的思想是先分组,进行预排序,使数组趋向于有序。

  • 然后进行逐步减小分组的跨度,直至分组跨度为1,变为有序排序。
    在这里插入图片描述

  • 如上图所示,先进行分组,在组内进行排序。

  • 希尔排序可以有两种方式

  1. 一组排完再排另一组

希尔排序定义

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

希尔排序测试

void TestShellSort()
{int a[] = { 9, 7, 6 ,4 ,8 ,3 ,5 ,1 ,2, 0 };PrintArray(a, sizeof(a) / sizeof(a[0]));ShellSort(a, sizeof(a) / sizeof(a[0]));PrintArray(a, sizeof(a) / sizeof(a[0]));}

效果如下:
在这里插入图片描述

  1. 多组并排----每次排一组的一个数

希尔排序定义

// 希尔排序---- 多组并排
void ShellSort(int* a, int n)
{int gap = n;while (gap > 1){gap /= 2;int i = 0;for (i = 0; i < n - gap; i++){int end = i;int tmp = a[end + gap];while (end >= 0){if (tmp < a[end]){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}}
}

希尔排序测试

void TestShellSort()
{int a[] = { 9, 7, 6 ,4 ,8 ,3 ,5 ,1 ,2, 0 };PrintArray(a, sizeof(a) / sizeof(a[0]));ShellSort(a, sizeof(a) / sizeof(a[0]));PrintArray(a, sizeof(a) / sizeof(a[0]));}

效果如下:
在这里插入图片描述

  • 希尔排序的时间复杂度差不多是 O(N1.3 ).

三、选择排序

选择排序定义

void Swap(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}// 选择排序
void SelectSort(int* a, int n)
{int left = 0;int right = n - 1;while (left < right){int maxi = left;int mini = left;int i = 0;for (i = left + 1; i <= right; i++){if (a[i] < a[mini])mini = i;if (a[i] > a[maxi])maxi = i;}Swap(&a[left], &a[mini]);if (left == maxi){maxi = mini;}Swap(&a[right], &a[maxi]);left++;right--;}
}

选择排序测试

void TestSelectSort()
{int a[] = { 9, 2, 6, 8, 4, 7, 5, 3, 1, 0 };int sz = sizeof(a) / sizeof(a[0]);PrintArray(a, sz);SelectSort(a, sz);PrintArray(a, sz);
}

效果如下:
在这里插入图片描述

四、堆排序

堆排序定义

void Swap(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}// 向下调整建堆
// 升序建大堆
void AdjustDown(int* a, int n, int parent)
{int child = parent * 2 + 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 = parent * 2 + 1;}}// 堆排序
void HeapSort(int* a, int n)
{// 建堆----向下调整建堆int i = 0;for(i = (n - 1 - 1) / 2; i >= 0; i--){AdjustDown(a, n, i);}// 堆排序int end = n - 1;while (end > 0){Swap(&a[0], &a[end]);end--;AdjustDown(a, end+1, 0);}}

堆排序测试

void TestHeapSort()
{int a[] = { 9, 2, 6, 8, 4, 7, 5, 3, 1, 0 };int sz = sizeof(a) / sizeof(a[0]);PrintArray(a, sz);HeapSort(a, sz);PrintArray(a, sz);
}

效果如下:
在这里插入图片描述

五、冒泡排序

冒泡排序定义

void Swap(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}// 冒泡排序
void BubbleSort(int* a, int n)
{int j = 0;for (j = 0; j < n - 1; j++){int i = 0;for (i = 0; i < n - 1- j; i++){if (a[i] > a[i + 1])  {Swap(&a[i], &a[i + 1]);}}}}

冒泡排序测试

void TestBubbleSort()
{int a[] = { 9, 2, 6, 8, 4, 7, 5, 3, 1, 0 };int sz = sizeof(a) / sizeof(a[0]);PrintArray(a, sz);BubbleSort(a, sz);PrintArray(a, sz);
}

效果如下:
在这里插入图片描述


总结

C语言数据结构排序、插入排序、希尔排序(多组并排、一组排完排另一组)、选择排序、堆排序、冒泡排序等的介绍

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

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

相关文章

如何以定投策略投资场外个股期权?

场外个股期权为投资者提供了一种灵活且富有潜力的投资工具。与传统的投资方式不同&#xff0c;场外个股期权以其低门槛、高灵活性和潜在的较高回报吸引了众多投资者。对于希望长期稳健增值的投资者来说&#xff0c;利用定投策略来投资场外个股期权是一个值得考虑的选项。 文章…

[JS]学习笔记2 -- JAVAScript数据类型

一、常量 概念&#xff1a;使用 const 声明的变量称为“常量”。 使用场景&#xff1a;当某个变量永远不会改变的时候&#xff0c;就可以使用 const 来声明&#xff0c;而不是let。 命名规范&#xff1a;和变量一致 注&#xff1a;常量不允许重新赋值&#xff0c;在声明的时…

k8s 中正确删除一个 pod

pod 删除后会自动重启个新 pod 怎么办&#xff1f; 这个问题通常是由于各种控制器导致的&#xff1a; Deployment: 如果Pod是由Deployment管理的&#xff0c;那么Deployment的目的就是保持所需数量的Pod运行。检查Deployment的配置&#xff0c;并根据需要更新或删除Deploymen…

消息队列的选型

消息队列的选型 现时代中可供我们选择的消息队列组件不少也不多&#xff0c;在国内环境中&#xff0c;大多数企业需要考虑的组件往往只需要在RabbitMQ 、RocketMQ、Kafka中选择&#xff1b; 为此针对以上三者在何种系统何种业务下是最佳选型&#xff0c;此篇记录&#xff1b;…

fork()和execl()结合使用的用法

fork()和execl()通常结合使用是为了在子进程中执行新的程序&#xff0c;而不会影响父进程。在上述代码中&#xff0c;fork()创建了一个子进程&#xff0c;execl()则在子进程中替换当前进程的执行上下文&#xff0c;用/bin/remount程序替代。这种组合有以下几个原因&#xff1a;…

什么样的男士内裤比较好?按这个方法选男士内裤不会出错!

男士内裤作为日常穿着的重要服饰&#xff0c;其舒适度与卫生性对男士们的健康至关重要。随着时代的变迁&#xff0c;男士内裤的款式与材质也日益丰富多样&#xff0c;为男士们提供了更多选择。 目前市场上&#xff0c;男士内裤主要分为三角、平角和四角三大类别。其中&#xf…

GPT-4o横空出世:技术革命的新篇章

各个版本之间的对比分析 GPT-3.5 GPT-3.5是OpenAI在GPT-3的基础上推出的改进版本。其特点包括&#xff1a; 参数规模&#xff1a;GPT-3.5维持了GPT-3的参数规模&#xff0c;但在模型优化和训练数据量上进行了改进。自然语言处理&#xff1a;在自然语言理解和生成上有了进一步的…

结构体+结构体内存对齐+结构体实现位段

结构体内存对齐实现位段 一.结构体1.结构体的声明2.结构体变量成员访问操作符3.结构体传参4.匿名结构体5.结构的自引用 二.结构体内存对齐1.对齐规则2.为什么存在内存对齐&#xff1f;3.修改默认对齐数 三.结构体实现位段1.什么是位段2.位段的内存分配3.位段的跨平台问题4.位段…

帮助客服高效工作的快捷回复软件

在繁忙的客服工作中&#xff0c;对于客服团队来说&#xff0c;每天面对大量的客户咨询&#xff0c;如何快速、准确地回应每一位客户的需求&#xff0c;成为了他们日常工作中的一大挑战。而快捷回复软件的出现&#xff0c;无疑是客服人员的福音。今天&#xff0c;我要向大家介绍…

MySQL 关键特性一:插入缓冲、双写缓冲

前言 ​ 本文主要介绍 mysql 的几大特性之几&#xff0c;如&#xff1a;双写缓冲和插入缓存。 双写缓冲 基本概念 ​ 双写缓冲&#xff08;doublewrite buffer&#xff09;是MySQL/InnoDB中用于支持原子页面更新的一种机制。在传统的数据库系统中&#xff0c;为了保证数据的…

Android Dialog使用汇总

Dialog分类 AlertDialog Dialog 类是对话框的基类&#xff0c;官方建议我们不要直接实例化它&#xff0c;而是使用其子类来获取实例。AlertDialog是系统提供的一个直接子类&#xff0c;它能帮助我们快速构建出不同类型的弹窗。接下来就看下各种类型弹窗的使用。 1、普通对话框…

【区分vue2和vue3下的element UI Switch 开关组件,分别详细介绍属性,事件,方法如何使用,并举例】

在 Vue 2 的 Element UI 和 Vue 3 的 Element Plus 中&#xff0c;el-switch&#xff08;开关组件&#xff09;提供了类似的属性和事件&#xff0c;但可能存在一些细微的差别或新增的功能。下面我将分别介绍 Vue 2 的 Element UI 和 Vue 3 的 Element Plus 中的 el-switch 组件…

wpf工程中加入Hardcodet.NotifyIcon.Wpf生成托盘

1、在项目中用nuget引入Hardcodet.NotifyIcon.Wpf。如下图所示。 2、在App.xaml中创建托盘界面&#xff0c;代码是写在 App.xaml 里面 注意在application中一定要加入这一行代码&#xff1a; xmlns:tb"http://www.hardcodet.net/taskbar" 然后在<Application.R…

系统架构设计师【第20章】: 系统架构设计师论文写作要点 (核心总结)

文章目录 20.1 写作注意事项20.1.1 做好准备工作20.1.2 论文写作格式 20.2 如何解答试题20.2.1 论文解答步骤20.2.2 论文解答实例 20.3 论文写作方法20.3.1 如何写好摘要20.3.2 如何写好正文1.写作技巧2.可能涉及的关键技术 20.3.3 摘要和正文的关系 20.4 常见问题及…

C#启动一个cmd.exe多次随时输入命令并获取输出

想要实现的效果,程序通过Process类一次启动cmd,后台线程每隔一定时间,向其输入命令,获得并处理输出。 一、基本操作 首先,通常操作的例子一抓一大把: 1、通过Process启动cmd执行一条/多条(&&连接)命令; 2、退出(一条时可以在命令开头加“/c”自动退出,或…

html 使用svg矢量图时无法 调整宽高问题解决,不能像图片一样设置宽高比例问题

引入的路径后加 #svgView(preserveAspectRatio(none)) 具体代码如下 修改前 <img src"/assets/svgs/full_screen_full.svg" class"im"> 修改后 <img src"/assets/svgs/full_screen_full.svg#svgView(preserveAspectRatio(none))" cla…

免费注册US.KG域名支持接入CF

注册地址&#xff1a; https://register.us.kg/auth/register 号码和地址我是随便填的&#xff0c;不知道对以后有没有影响 收到激活邮件&#xff0c;可能在垃圾箱里 接下来是有个KYC验证&#xff0c;需要填写信息和上传KYC照片&#xff0c;我也是乱填的和乱上传的。可以去找…

ERPNext - 用Python打造您的企业资源规划解决方案

文章目录 ERPNext - 用Python打造您的企业资源规划解决方案第一部分&#xff1a;背景第二部分&#xff1a;ERPNext是什么&#xff1f;第三部分&#xff1a;如何安装ERPNext&#xff1f;第四部分&#xff1a;ERPNext基本使用方法第五部分&#xff1a;场景应用示例第六部分&#…

Excel 文件损坏了打不开怎么办?几种 Excel 文件修复方法帮助你

当你想要打开电脑 Excel 文件的时候发现系统提示文件被损坏或者其他一些原因导致无法打开&#xff0c;这时候应该怎么办呢&#xff1f;别急下面为大家总结了 Excel 文件修复的一些方法。 更改信任中心 Excel 软件具有内置的安全功能会限制有潜在风险的文件&#xff0c;当 Exc…

挑战你的数据结构技能:复习题来袭【6】

1. (单选题)设无向图的顶点个数为n,则该图最多有&#xff08;&#xff09;条边 A. n-1 B. n(n-1)/2 C. n(n1)/2 D. 0 答案&#xff1a;B 分析&#xff1a; 2. (单选题)含有n个顶点的连通无向图,其边的个数至少为()。 A. n-1 B. n C. n1 D. nlog2n 答案&#xff1a;A…