C语言排序(桶排序,冒泡排序,选择排序,插入排序,快速排序)

参考:C语言五大排序(桶排序,冒泡排序,选择排序,插入排序,快速排序)动态演示
作者:一只青木呀
发布时间: 2020-09-09 20:18:43
网址:https://blog.csdn.net/weixin_45309916/article/details/108483621

目录

  • 什么是排序?
  • 1、桶排序
    • 概念
    • 思路
    • demo
    • 运行效果
  • 2、冒泡排序
    • 动图演示
    • 概念
    • 思路
    • demo
    • 运行效果
  • 3、选择排序
    • 动图演示
    • 概念
    • 思路
    • demo
    • 运行结果
  • 4、插入排序
    • 动图演示
    • 概念
    • 思路
    • demo
    • 运行效果
  • 5、快速排序
    • 动图演示
    • 概念
    • 思路
    • demo
    • 运行结果

什么是排序?

排序: 把无序变成有序

1、桶排序

概念

桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。但桶排序并不是 比较排序,他不受到 O(n log n) 下限的影响。

思路

准备桶的时候,桶的大小是原来排序数组中最大元素的值加一,然后遍历无序的数组,把无序数组中的元素的值当成下标给到桶,每存在一个值,桶中的数量就加一。输出的时候,桶的下标值就是之前需要排序的数组的值,只有桶中的数量大于等于一的时候才表示有数据,再进行输出。

demo

#include <stdio.h>
#include <stdlib.h>int main()
{//桶排序//先准备桶  桶的大小是需要排序数组中的最大元素的值加一int app[10] = { 0 };//无序的数组int arr[9]={5,4,8,6,2,0,3,7,9};// 遍历无序的数组,把无序数组中的元素的值当成下标给到桶for (int i = 0; i < sizeof(arr) / sizeof(int); i++){app[arr[i]]++;     }//输出,把对应的元素出现了几次进行一个输出for (int i = 0; i < 10; i++){for (int j = 1; j <= app[i]; j++){printf("%d ", i);}}	printf("\n");return 0;
}

运行效果

在这里插入图片描述

2、冒泡排序

动图演示

在这里插入图片描述

概念

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。

它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。

这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

思路

每次进行两两比较,大的或者小的就往后移,每进行一次,最后一个数就是已经排好序的了。

demo

#include <stdio.h>//冒泡排序
void bullerSort(int arr[], int len)
{for (int i = 0; i < len - 1; i++)//比较次数{for (int j = 0; j < len - 1 - i; j++)//比较过程{if (arr[j]>arr[j + 1])//比较{//交换int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}
//输出
void print(int arr[], int len)
{for (int i = 0; i < len; i++){printf("%d ", arr[i]);}
}
int main()
{int arr[10]={5,9,11,32,18,54,78,0,87,111};bullerSort(arr,10);print(arr,10);printf("\n");return 0;
}

运行效果

在这里插入图片描述

3、选择排序

动图演示

在这里插入图片描述

概念

选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

思路

n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。具体算法描述如下:

初始状态:无序区为R[1…n],有序区为空;
第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1…i-1]和R(i…n)。该趟排序从当前无序区中-选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1…i]和R[i+1…n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;
n-1趟结束,数组有序化了。

demo

#include <stdio.h>//选择排序
void selectSort(int arr[], int len)
{for (int i = 0; i < len-1; i++){int min = i;//假设第一个元素是最小的for (int j = i + 1; j < len; j++){if (arr[j] < arr[min]){min = j;//保存最小元素的下标}}//交换int temp = arr[min];arr[min] = arr[i];arr[i] = temp;}
}
//输出
void print(int arr[], int len)
{for (int i = 0; i < len; i++){printf("%d ", arr[i]);}
}
int main()
{int arr[15]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};selectSort(arr,15);print(arr,15);printf("\n");return 0;
}

运行结果

在这里插入图片描述

4、插入排序

动图演示

在这里插入图片描述

概念

插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

思路

一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:

  • 从第一个元素开始,该元素可以认为已经被排序;
  • 取出下一个元素,在已经排序的元素序列中从后向前扫描;
  • 如果该元素(已排序)大于新元素,将该元素移到下一位置;
  • 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
  • 将新元素插入到该位置后;
  • 重复步骤2~5。

demo

#include <stdio.h>//插入排序
void insertSort(int arr[], int len)
{int temp;//保存要插入的元素int j;//从当前要要比较插入的元素的前面一个开始for (int i = 1; i < len; i++)//第一个元素视为有序,把后面的元素一个一个的插入到前面{temp = arr[i];j = i - 1;while (j >= 0&&arr[j]>temp){arr[j + 1] = arr[j];//前面的元素往后面移动j--;}arr[j + 1] = temp;//把要插入的元素,插入进对应的位置}
}
//输出
void print(int arr[], int len)
{for (int i = 0; i < len; i++){printf("%d ", arr[i]);}
}
int main()
{int arr[15]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};insertSort(arr,15);print(arr,15);printf("\n");return 0;
}

运行效果

在这里插入图片描述

5、快速排序

动图演示

在这里插入图片描述

概念

快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

思路

快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:

  • 从数列中挑出一个元素,称为 “基准”(pivot);
  • 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到 任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
  • 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

demo

#include <stdio.h>//快速排序
void quickSort(int arr[], int lift, int right)
{if (lift > right)return;int i = lift, j = right, temp = arr[i];//获取左右和基准数while (i < j){while (temp < arr[j] && i < j)j--;if (i < j)arr[i++] = arr[j];while (temp>arr[i] && i < j)i++;if (i < j)arr[j--] = arr[i];}arr[i] = temp;quickSort(arr, lift, i - 1);//左边quickSort(arr, i + 1, right);//右边
}
//输出
void print(int arr[], int len)
{for (int i = 0; i < len; i++){printf("%d ", arr[i]);}
}
int main()
{int arr[15]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};quickSort(arr,0,14);print(arr,15);printf("\n");return 0;
}

运行结果

在这里插入图片描述

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

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

相关文章

FIFO分枝_限界算法

问题&#xff1a; 检索4-皇后问题的状态空间树如下图的基本过程。&#xff08;4-皇后问题解空间的树结构&#xff0c;结点按深度优先检索编号&#xff09; 如果按序扩展这些结点&#xff0c;则下一个E-结点就是结点2。扩展结点2后生成结点3&#xff0c;8和13。利用限界函数(同行…

智能家居APP使用指南

参考&#xff1a;智能家居APP使用指南 作者&#xff1a;图触靓 发布时间&#xff1a; 2021-04-14 14:11:40 网址&#xff1a;https://blog.csdn.net/bhbhhyg/article/details/115694774 目录一、如何修改IP&#xff0c;端口号&#xff0c;以及发送的指令二、如何增加或者删除一…

python zlib字符串压缩

2019独角兽企业重金招聘Python工程师标准>>> 在做网络程序时,可以对字符串进行压缩来节省带宽 项目中用到 {"compress": <压缩标记>, "result":[[设备类型.设备ID, 设备名称, 单位ID, 设备功能], ...]} 只做了简单的压缩解压缩,也没crc3…

linux做一个客户端与WemosD1作为服务器的无线通信(局域网通信)

参考&#xff1a;linux做一个客户端与WemosD1作为服务器的无线通信&#xff08;局域网通信&#xff09; 作者&#xff1a;枕上 发布时间&#xff1a;2021-07-19 23:33:44 网址&#xff1a;https://blog.csdn.net/jinchi_boke/article/details/118916896?utm_sourceapp&app…

C语言学习书籍推荐《C语言程序设计 现代方法(第2版)》下载

下载地址&#xff1a;点我 C语言仍然是计算机领域的通用语言之一&#xff0c;但现在的C语言已经和当初的时候大不相同了。本书主要的一个目的就是通过一种“现代方法”来介绍C语言&#xff0c;书中强调标准C&#xff0c;强调软件工程&#xff0c;不再强调“手工优化”。这一版中…

wemosD1_WIFI模块 与 arduino

参考&#xff1a;wemosD1_WIFI模块 与 arduino 作者&#xff1a;枕上 发布时间&#xff1a;2021-07-19 21:49:55 网址&#xff1a;https://blog.csdn.net/jinchi_boke/article/details/118915142 目录作为设备接入wifi&#xff08;STA模式&#xff09;架设Wemos为ftp服务器ardu…

本机在合成图片经常提示内存不足

转载于:https://www.cnblogs.com/niyl/p/9988614.html

tp5 php7 报500,记一次TP单元测试报500错误的问题

记一次TP单元测试报500错误的问题一直听说好的单元测试能提高代码质量&#xff0c;昨天终于在下定决心弄懂单元测试&#xff0c;但第一步就把我干趴下了&#xff0c;我的问题在下面开始都没有什么问题&#xff0c;tp5单元测试的手册就那一点&#xff0c;通过看云上一位仁兄写的…

H3C配置

H3C交换机配置 1.查看设备版本,确定是否需要升级 <H3C>dis version 2.vlan及接口配置 注&#xff1a;正式配置前可以查看下现有的VLAN。命令如下 <H3C>dis vlan <H3C>sys                          //进入系统视图模式 [H3C]vlan …

创建自己的共用js库

直至昨晚为止&#xff0c;学习了一个多月的MVC与jQuery&#xff0c;从所做的练习中&#xff0c;发觉jQuery的代码也有跟C#语言一样可以重构&#xff0c;多页面有相同使用的方法函数&#xff0c;均可以放置于一个单独立的js文件或是自定义的js库中。在使用时&#xff0c;引用此库…

视频专辑:JAVA语言入门视频教程

为什么80%的码农都做不了架构师&#xff1f;>>> 专辑&#xff1a;JAVA语言入门视频教程 简介:该视频专辑是java的入门教程&#xff0c;适合初学者学习java&#xff0c;讲的也非常容易懂&#xff0c;希望能给想学习java的朋友一些帮助。 1 JAVASE 01 简介 2013-10…

视频专辑:Servlet视频教程

为什么80%的码农都做不了架构师&#xff1f;>>> 专辑&#xff1a;Servlet视频教程 简介:郭宏志 Servlet视频教程 1 郭宏志 Servlet 01 WEB工程结构 2013-10-26 00:32 | 播放(9) | 评论(0) | 时长:28:39 2 郭宏志 Servlet 02 Servlet简介 2013-10-26 00:31 …

基于wemos D1的无线遥控灯(433m无线模块)

参考&#xff1a;基于wemos D1的无线遥控灯(433m无线模块) 作者&#xff1a;一只小阿大:) 发布时间&#xff1a; 2021-04-16 09:25:53 网址&#xff1a;https://blog.csdn.net/qq_44610809/article/details/115747714 项目软硬件平台及开发环境 1.硬件平台 开发板&#xff1a…

Linux实战教学笔记37:企业级Nginx Web服务优化实战(上)

一&#xff0c;Nginx基本安全优化 1.1 调整参数隐藏Nginx软件版本号信息 一般来说&#xff0c;软件的漏洞都和版本有关&#xff0c;这个很像汽车的缺陷&#xff0c;同一批次的要有问题就都有问题&#xff0c;别的批次可能就都是好的。因此&#xff0c;我们应尽量隐藏或消除Web服…

探索云计算、大数据的特色化应用之路

云计算与大数据是当前最热门的两个话题&#xff0c;除了技术上的相关性以外&#xff0c;两者现在都面临同一个问题&#xff0c;就是如何更快更好地落地&#xff0c;也就是将云计算、大数据所代表的新技术、新业务模式与行业用户的实际需求紧密结合起来&#xff0c;驱动企业业务…

树莓派摄像头使用Motion监测人物动作

更多干货推荐可以去牛客网看看&#xff0c;他们现在的IT题库内容很丰富&#xff0c;属于国内做的很好的了&#xff0c;而且是课程刷题面经求职讨论区分享&#xff0c;一站式求职学习网站&#xff0c;最最最重要的里面的资源全部免费&#xff01;&#xff01;&#xff01;点击进…

ARM(IMX6U)ARM Cortex-A7中断系统(GPIO按键中断驱动蜂鸣器)

参考&#xff1a;Linux之ARM Cortex-A7 中断系统详解 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-09-16 16:07:22 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/108290225 目录1、中断是什么2、回顾STM32中断系统2.1、中断向量表(对应的…

测试——设计思维之获取反馈

获取用户反馈 为什么要测试&#xff1f; 尽早的从用户&#xff0c;干系人&#xff0c;专家那边获得反馈&#xff0c;能够迭代改善通过测试能够知道我们的主意设想的强项和弱势早失败如何测试&#xff1f; 让原型自己说话不要为自己的想法狡辩&#xff0c;原型是给用户&#xff…

Idea 设置Eclipse快捷键(常用)

使用Idea不习惯&#xff0c;特此将其配置成Eclipse风格的。 1、选择Eclipse风格&#xff0c;选择copy一份&#xff0c;可以自己重命名。 2、设置生成快捷键的快捷键&#xff08;例如&#xff1a;Eclipse中的Alt/&#xff09; 3、设置main函数快捷键&#xff08;补充&#xff1a…

php oracle视图,Oracle v$database视图分析

GUARD_STATUS&#xff1a;防止数据库修改的状态(可能为all或者none或者standby) SUPPLEMENTAL_LOG_DATA_MIN&#xff1a; SUPPLEMENTAL_LOG_DATA_PK&#xff1a;SQL> desc v$database名称 是否为空? 类型----------------- -------- ------------DBID NUMBERNAME VARCHAR2(…