排序

【常见的六大排序算法】插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序 在实现排序前,我们要先知道什么是排序。排序:简单的来说就是把一串数据按照一定的方式依次排序。例如:可以按照数字的大小升序或降序排列,或者按照英文字母的先后顺序排列等。使用这一系列的方式,就可以将一串无序状态下的数据排列成有序的数据。 阅读详情
设要排序的 数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的 排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
一趟快速排序的算法是:
1)设置两个变量i、j, 排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给 key,即 key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于 key的值A[j],将A[j]和A[i]互换;
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于 key的A[i],将A[i]和A[j]互换;
5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于 key,4中A[i]不大于 key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。

排序演示

示例

假设用户输入了如下数组:
下标
0
1
2
3
4
5
数据
6
2
7
3
8
9
创建变量i=0(指向第一个数据), j=5(指向最后一个数据), k=6( 赋值为第一个数据的值)。
我们要把所有比k小的数移动到k的左面,所以我们可以开始寻找比6小的数,从j开始,从右往左找,不断递减变量j的值,我们找到第一个下标3的数据比6小,于是把数据3移到下标0的位置,把下标0的数据6移到下标3,完成第一次比较:
下标
0
1
2
3
4
5
数据
3
2
7
6
8
9
i=0 j=3 k=6
接着,开始第二次比较,这次要变成找比k大的了,而且要从前往后找了。递加变量i,发现下标2的数据是第一个比k大的,于是用下标2的数据7和j指向的下标3的数据的6做交换,数据状态变成下表:
下标
0
1
2
3
4
5
数据
3
2
6
7
8
9
i=2 j=3 k=6
称上面两次比较为一个循环。
接着,再递减变量j,不断重复进行上面的循环比较。
在本例中,我们进行一次循环,就发现i和j“碰头”了:他们都指向了下标2。于是,第一遍比较结束。得到结果如下,凡是k(=6)左边的数都比它小,凡是k右边的数都比它大:
下标
0
1
2
3
4
5
数据
3
2
6
7
8
9
如果i和j没有碰头的话,就递加i找大的,还没有,就再递减j找小的,如此反复,不断循环。注意判断和寻找是同时进行的。
然后,对k两边的数据,再分组分别进行上述的过程,直到不能再分组为止。
注意:第一遍快速排序不会直接得到最终结果,只会把比k大和比k小的数分到k的两边。为了得到最后结果,需要再次对下标2两边的数组分别执行此步骤,然后再分解数组,直到数组不能再分解为止(只有一个数据),才能得到正确结果。

调用函数

在c++中可以用函数qsort()可以直接为 数组进行排序。 [1]  
用 法:
void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *));
参数:
  1 待 排序数组首地址
  2 数组中待排序元素数量
  3 各元素的占用空间大小
  4 指向函数的 指针,用于确定排序的顺序


C++语言

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
 
using  namespace  std;
 
void  Qsort( int  a[],  int  low,  int  high)
{
     if (low >= high)
     {
         return ;
     }
     int  first = low;
     int  last = high;
     int  key = a[first]; /*用字表的第一个记录作为枢轴*/
 
     while (first < last)
     {
         while (first < last && a[last] >= key)
         {
             --last;
         }
 
         a[first] = a[last]; /*将比第一个小的移到低端*/
 
         while (first < last && a[first] <= key)
         {
             ++first;
         }
         
         a[last] = a[first];    
/*将比第一个大的移到高端*/
     }
     a[first] = key; /*枢轴记录到位*/
     Qsort(a, low, first-1);
     Qsort(a, first+1, high);
}
int  main()
{
     int  a[] = {57, 68, 59, 52, 72, 28, 96, 33, 24};
 
     Qsort(a, 0,  sizeof (a) /  sizeof (a[0]) - 1); /*这里原文第三个参数要减1否则内存越界*/
 
     for ( int  i = 0; i <  sizeof (a) /  sizeof (a[0]); i++)
     {
         cout << a[i] <<  "" ;
     }
     
     return  0;
} /*参考数据结构p274(清华大学出版社,严蔚敏)*/

C语言版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
void  sort( int  *a,  int  left,  int  right)
{
     if (left >= right) /*如果左边索引大于或者等于右边的索引就代表已经整理完成一个组了*/
     {
         return  ;
     }
     int  i = left;
     int  j = right;
     int  key = a[left];
     
     while (i < j)                                /*控制在当组内寻找一遍*/
     {
         while (i < j && key <= a[j])
         /*而寻找结束的条件就是,1,找到一个小于或者大于key的数(大于或小于取决于你想升
         序还是降序)2,没有符合条件1的,并且i与j的大小没有反转*/ 
         {
             j--; /*向前寻找*/
         }
         
         a[i] = a[j];
         /*找到一个这样的数后就把它赋给前面的被拿走的i的值(如果第一次循环且key是
         a[left],那么就是给key)*/
         
         while (i < j && key >= a[i])
         /*这是i在当组内向前寻找,同上,不过注意与key的大小关系停止循环和上面相反,
         因为排序思想是把数往两边扔,所以左右两边的数大小与key的关系相反*/
         {
             i++;
         }
         
         a[j] = a[i];
     }
     
     a[i] = key; /*当在当组内找完一遍以后就把中间数key回归*/
     sort(a, left, i - 1); /*最后用同样的方式对分出来的左边的小组进行同上的做法*/
     sort(a, i + 1, right); /*用同样的方式对分出来的右边的小组进行同上的做法*/
                        /*当然最后可能会出现很多分左右,直到每一组的i = j 为止*/
}



C语言代码

 
------------上面代码复杂难懂-----------------
int  bsearchWithoutRecursion(intarray[], int  low, int  high, int  target)
{
while (low<=high)
{
int  mid=(low+high)/2;
if (array[mid]>target)
high=mid-1;
elseif(array[mid]<target)
low=mid+1;
else //findthetarget
return  mid;
}
//the array does not contain the target
return -1;
}
----------------------------------------
递归实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
intbinary_search(constintarr[],intlow,inthigh,intkey)
{
int  mid=(low+high)/2;
if (low>high)
return  -1;
else {
if (arr[mid]==key)
return  mid;
else  if (arr[mid]>key)
return  binary_search(arr,low,mid-1,key);
else
return  binary_search(arr,mid+1,high,key);
}
}

常见排序算法总结(冒泡排序、快速排序、插入排序、希尔排序、选择排序、堆排序、归并排序、计数排序) 排序分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。八大排序指内部排序。 1.冒泡排序 在要排序的一组数中,对当前还未排好序的范围... 阅读详情

相关推荐

MS2107 CVBS转USB2.0 音视频采集芯片,支持1080P@30HZ输出

MS2107 是一款视频和音频采集芯片,支持CVBS转USB2.0 ;可以将 CVBS、S-Video 和音频信号通过 USB接口传送到 PC、智能手机和平板电脑上预览或采集。

TEL18967112838的博客 2075

六大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序

文章目录:1. 插入排序2.希尔排序 1. 插入排序 步骤: 1.从第一个元素开始,该元素可以认为已经被排序 2.取下一个元素tem,从已排序的元素序列从后往前扫描 3.如果该元素大于tem,则将该元素移到下一位 4.重复步骤3,直到找到已排序元素中小于等于tem的元素 5.tem插入到该元素的后面,如果已排序所有元素都大于tem,则将tem插入到下标为0的位置 6.重复步骤2~5 动图演示如下: 思路:   在待排序的元素中,假设前n-1个元素已有序,现将第n个元素插入到前面已经排好的序列中,使得前n个

HanMeng的博客 69万+

芯片低功耗设计的两种常用EDA流程

如题。

EricWZY2008的专栏 5555

常见排序算法(插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序,计数排序,基数排序,桶排序)

常见排序算法(插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序,计数排序,基数排序,桶排序)

2301_80288511的博客 3155

西门子PLC作为TCP客户端通信:TSEND_C/TRCV_C指令实战与状态机设计

在工业自动化与物联网系统中,TCP/IP通信是实现设备间数据交换的基础协议,其核心在于建立可靠的点对点连接与数据流传输。其工作原理基于客户端-服务器模型,通过三次握手建立连接,确保数据包的顺序与完整性。这项技术的工程价值在于打破了传统工控设备被动响应的局限,为实时数据主动上报、边缘计算集成提供了通用且灵活的解决方案。在工业物联网、设备远程监控、生产数据实时采集等场景中,TCP客户端模式使得PLC能够主动将产线状态、报警信息等关键数据推送至服务器或数据库,实现更及时的数据交互。本文聚焦于西门子S7-1200/

weixin_29194255的博客 360

避坑指南:ESP32S3驱动INMP441麦克风时的常见硬件冲突与解决方案

本文详细解析了ESP32S3驱动INMP441麦克风时常见的硬件冲突问题,包括GPIO资源冲突、电源噪声、I2S时钟同步等,并提供了实用的解决方案和优化策略。通过实测数据和代码示例,帮助开发者快速排查和解决音频设备开发中的疑难问题,提升系统稳定性和音频质量。

embedding5hiker的博客 942

算法——十大排序(冒泡排序,选择排序,堆排序,插入排序,归并排序,快速排序,希尔排序,计数排序,基数排序,桶排序)

排序算法准备算法模板冒泡排序(Bubble Sort)定义执行流程代码实现选择排序(Selection Sort)定义执行流程代码实现插入排序(Insertion Sort)定义执行流程代码实现希尔排序(Shell Sort)定义执行流程代码实现堆排序(Heap Sort)定义执行流程代码实现归并排序(Merge Sort)定义执行流程代码实现快速排序(Quick Sort)定义执行流程代码实现计数排序(Counting Sort)定义执行流程代码实现基数排序(Radix Sort)定义执行流程代码实现桶排

mazouri的博客 5018

西门子smart能搜到cpu但连接当前IP地址失败

将ip地址改到同一网段 本机为192.168.1.119就是192.168.1.1网段,但plc在192.168.0.1网段,所以显示ip连接失败,改为同一网段192.168.1.xxx即可(为避免ip冲突尽量改到200往后最大255)如果显示这一步,那么你的物理连接是没有问题的,应当是plc和电脑并不在同一网段导致的问题。输入ipconfig 查看本机网段与plc是否为同一网段。此电脑就不在同一网段所有造成通讯失败,接下来解决这个问题。win+r打开运行,打开cmd。再次尝试,如果还是报错,那么。

weixin_62678581的博客 9858

排序算法:插入排序、冒泡排序、选择排序、希尔排序、堆排序、快速排序、归并排序

排序算法相关总结,涉及的排序算法有:插入排序、冒泡排序、选择排序、希尔排序、堆排序、快速排序。

qq_53130059的博客 5646

Altium Designer系列: 软件系统参数配置保存

【Altium Designer实践】 软件系统参数配置保存 作者 CodeAllen ,转载请注明出处 目录设置中文菜单高亮模式设置文件关联pcb设置布线设置保存配置文件(复用) 设置中文菜单 DXP->Preferences 高亮模式设置 文件关联 pcb设置 布线设置 保存配置文件(复用) ......

CodeAllen嵌入式 2018

【永磁同步电机】simulink永磁同步电机PMSM矢量控制【含Matlab源码 7372期】

simulink永磁同步电机PMSM矢量控制 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 1028

【算法】六大排序 插入排序 希尔排序 选择排序 堆排序 冒泡排序 快速排序

六大排序 插入排序 希尔排序 选择排序 堆排序 冒泡排序 快速排序

一点一点变好 3592

【学习系列】SAP RAP 2:创建第一个RAP应用

本文介绍了从零开始创建基于SAP RAP(ABAP RESTful Application Programming Model)的Fiori应用的完整流程。首先说明了学习RAP需要结合官方文档和教程,并提供了相关资源链接。文章详细讲解了开发环境的准备要求,包括系统版本、开发工具和基本知识。重点演示了如何通过8个步骤创建支持CRUD操作和草稿功能的RAP应用:1)创建数据库表;2)定义CDS视图实体;3)创建投影视图;4)定义行为;5)创建行为投影;6)定义服务;7)绑定服务;8)添加UI注解。

DeveloperMrMeng的博客 1496

【七大排序算法】插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序、归并排序

所谓排序,就是把一堆杂乱的数据,排成升序或降序(递增/增减)。假设一组数据[1,2,9,5,5,6,8],进行升序排序后,两个5的相应位置不发生改变,即称为稳定的排序,否则就是不稳定排序。数据元素全部放在内存中进行排序。即将待排序的记录存储在外存中,排序时再把数据一部分一部分地调入内存进行排序,在排序过程中需要多次进行内存和外存之间地交换。

Original0的博客 3623

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【Python排序算法】一文掌握十大排序算法,冒泡排序、插入排序、选择排序、归并排序、计数排序、基数排序、希尔排序和堆排序

一文掌握十大排序算法,冒泡排序、插入排序、选择排序、归并排序、计数排序、基数排序、布尔排序、桶排序和堆排序

qq_35831906的博客 2541

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

常见的五种排序,冒泡排序,选择排序,插入排序,并归排序,快速排序

冒泡排序 冒泡排序介绍: 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。 它重复地跑过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小)那么它就会按照大到小的排序方式来。它必须要把算所有的元素重复地进行跑一遍,直到没有相邻元素需要交换,也就是说该元素列已经排序完成。 冒泡排序算法的原理如下: 1,比较相邻的元素。如果第一个比第二个大,就交换他们两个,如果不是相等的就跳过比下面的元素 ,这样依次的循环下去 直到所有的元素都比较完成才结束。 2,针对所有的元素重复以上的

无心 2622

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

九种经典排序算法详解(冒泡排序,插入排序,选择排序,快速排序,归并排序,堆排序,计数排序,桶排序,基数排序)

综述 最近复习了各种排序算法,记录了一下学习总结和心得,希望对大家能有所帮助。本文介绍了冒泡排序、插入排序、选择排序、快速排序、归并排序、堆排序、计数排序、桶排序、基数排序9种经典的排序算法。针对每种排序算法分析了算法的主要思路,每个算法都附上了伪代码和C++实现。 电梯直达 1. 冒泡排序 2. 插入排序 3 .选择排序 4. 快速排序 5. 归并排序 6. 堆排序 7. ...

胡LiuJia@BLOG 6728

排序——简单排序

简单排序有三种,包括选择排序(Selection Sort)、冒泡排序(Bubble Sort)和插入排序(Insert Sort)。 选择排序每次都选择最小的关键码记录,直到完全排序。实质上就是起泡排序。选择排序第 i 趟选择的是数组中第 i 小的记录,并将这个记录放到数组的第 i 个位置。 特点:大部分时间都在比较,很少交换。 在寻找下一个较小的数时,需要检索整个未排序的序列,但只用一...

魔筝炼药师 7264

七大排序(插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序)

七大排序(插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序) 1.插入排序:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。 2.希尔排序:先选定一个整数,把待排序文件中所有记录分成gap/2个组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后取,重复上述分组和排序的工作。当到达gap...

gp1330782530的博客 3185

四大排序——冒泡排序、选择排序、插入排序、堆排序

冒泡排序、插入排序、选择排序、堆排序的描述

qq_46476515的博客 2873

排序排序排序

​​​​​​​。

m0_55661792的博客 893

排序(插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序)

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。数据元素全部放在内存中的排序。数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。

uyeonashi的博客 1153

常见的几种排序方法(冒泡排序、选择排序、插入排序、快速排序等)

排序算法有很多,包括插入排序,冒泡排序,堆排序,归并排序,选择排序,计数排序,基数排序,桶排序,快速排序等。 插入排序,堆排序,选择排序,归并排序,快速排序,冒泡排序都是比较排序,它们通过对数组中的元素进行比较来实现排序,其他排序算法则是利用非比较的其他方法来获得有关输入数组的排序信息。 冒泡排序 冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元...

qq_38769551的博客 5120

比较排序(选择排序、冒泡排序、插入排序、快速排序、希尔排序、合并排序、堆排序)

比较排序是一类排序算法的统称,这些排序算法主要是通过对待排序数组中的元素进行比较来实现排序的。 常见的比较排序包括:选择排序、冒泡排序、插入排序、快速排序、希尔排序、合并排序和堆排序等。 对于两个元素,通过比较它们的大小就能够决定它们的排列顺序。 在出现两个或多个元素一样大的情况时,如果所使用的比较排序算法是稳定的,则会保持它们在原数组中的相对顺序。 选择排序 选择排序(Selection Sort)是一种很简单直观的排序算法,它的主要思想是:将待排序序列分成两部分,其中一部分为已排序子序列,而另一部分为未

DoWayChan的博客 3738

Hive hql语句 排序【全局排序、按别名排序、多个列排序、局部排序、分区排序】

文章目录1.全局排序案例实操:2.按照别名排序案例实操3.多个列排序案例实操4.每个MapReduce内部排序(Sort By)局部排序案例操作:(1)设置reduce个数(2)查看reduce个数(3)将查询结果按照成绩降序排列(4)将查询结果导入文件当中5.分区排序案例实操6.CLUSTER BY 1.全局排序 Order By : 1.使用order by 子句排序: ASC(ascend):升序(默认) DESC(descend):降序 2.order by 子句在select语句的结尾。

shuyv的博客 4291
上一篇: 十种排序算法做简单总结,含代码
下一篇: Go语言探索第一天,学习笔记
VectorC0de
博客等级 码龄14年 1粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值