C语言一维数组乱序冒泡法, 将一六个乱序的数按照升序排列,但是结果不对。怎么回事儿?求大佬

版权声明:本文为博主原创文章未经博主允许不得转载。 /qq_/article/details/

对与算法的执行效率我们一般用三个方面去衡量

1 最好,最坏平均时间复杂度
我们分析一个算法时,需要分析出最好最坏,平均时间复杂度还要指出什么时候最好,什么时候最坏
在接近有序的数组乱序和接近完全无需的数组乱序,时间复雜度肯定是有区别的我们需要知道,时间在不同数据下的性能表现

2 时间复杂度的系数常数,低阶

我们知道当数据规模很大时常常会忽略低阶,系数 但是在实际情况,我们要排序1000或者100个数据这种情况就要把常数,低阶系数考虑进来

3 比较的次数,或者移动的次数

基於比较的算法会有俩种操作,元素大小比较和元素数据交换计算效率也会把比较的次数和交换的次数算进去

算法的内存消耗可以用空間复杂度来表示,我们这里引入一个新概念原地排序,就是指空间复杂度伪O(1)的算法

如果待排序中存在相同的数据排序后,相同的数据間的先后顺序不变举个例子,我们有组数据3 7 5 6 3 2 排序后 2 3 3 5 6 7 排序后俩个3的先后位置不变,我们把这种算法叫做稳定排序算法反之是不稳定排序算法
这种稳定排序算法有什么优点吗?
比如现在有一个需求要求把10w给订单,按照订单金额大小和时间排序那该如何排序,如果我们鼡稳定排序算法就可以先按照时间排序,然后再按照金额排序稳定排序算法保证,金额相同的俩个数据排序后前后顺序不变

排序算法太多了,今天我们只讲一些经典的排序算法

冒泡排序只会操作相邻的俩个数据每次冒泡排序都会都会对相邻的俩个元素进行比较,看昰否满足大小关系如果不满足就让他们互换,一次冒泡至少会让一个元素出现在他应该出现的位置重复n次也就完成了排序

每经过一次冒泡,最大值会出现在最后位置
经过n次冒泡完成排序
举个例子:相邻元素俩俩比较,大的向后放第一次完毕后,最大值出现在最后边

//數组乱序数据少于等于1 直接返回 //相邻的俩个进行比较

上边的冒泡程序如何优化
其实,当某次冒泡时没有了数据的交换,说明完全达到叻完全有序就没有必要继续冒泡了,例如下边这个例子6个数据我只需要4次冒泡就可以了

//数组乱序数据少于等于1 直接返回 //提前退出循环嘚标志 //相邻的俩个进行比较

第一 冒泡排序是原地排序吗
冒泡排序只涉及相邻元素的交换过程,常量级的空间复杂度为O(1),冒泡排序是原地排序

第二 冒泡排序是稳定排序吗
在冒泡排序排序中只有相邻来个元素交换时,才会导致顺序的改变为了保证冒泡算法的稳定性,当俩個相同的数据比较时我们不交换,所以冒泡排序是稳定排序

第三 冒泡排序的时间复杂度是多少

最好的情况下是要排序数组乱序是有序嘚,那么只需要一次冒泡就可以了时间复杂度为O(n),最坏的情况是要排序的数组乱序是倒序的,我们需要n次冒泡操作所以时间复杂度為O(n2)

如何在一个有序的数组乱序中插入数据后,保持数组乱序有序呢 很简单,我们遍历这个数组乱序找到数据该插入的位置,插入即可
這中方法可以保持数组乱序一致有序一个无序数组乱序我们也可以借助上方方法,进行排序就是插入排序

我们把数组乱序分为俩个空間,已排序空间未排序空间每次从未排序空间中取出一个数据,插入已排序空间直到未排序空间数据为空
如图所示,左边是已排序涳间右边是未排序空间
插入排序也包括俩种操作,元素的比较元素的交换

 // 插入排序a 表示数组乱序,n 表示数组乱序大小
 //数组乱序数量尛于等于1 直接返回
 //从下标 1 处开始遍历

插入排序是原地排序算法吗
我们可以看出插入排序并不需要额外的储存空间,空间复杂度为O(1)是原哋排序算法

插入排序是稳定排序算法吗
插入排序面对相同的元素,我么你可以选择把数据插入到相同元素的后面所以是稳定排序算法

插叺排序的时间复杂度是多少
如果要排序的数据是有序的,我们不需要搬运任何数据而且我们只需要比较一次就可以确认插入位置,这情況下最好时间复杂度为O(n)

如果要排序的数组乱序是倒序的每次插入都相当于在数组乱序头部插入数据,所以需要移动大量的数据最坏时間复杂度为O(n2)

选择排序的思路有点类似于插入排序,也分排序区间和未排序区间但是选择排序每次都会从未排序区间找到最小值,插入到排序区间的末尾

选择排序空间复杂度为O(1)是原地排序算法

最好最坏时间复杂度都是O(n2)

选择排序是稳定排序算法吗
从上面的图上可以看出,每佽都要找出最小值并交换这样就打乱了先后顺序,不是稳定的排序算法

为什么插入排序比冒泡排序使用更广呢

虽然他们的时间复杂度都昰O(n2)但是他们的就换过程存在差异

冒泡排序中数据的交换操作:
插入排序中数据的移动操作:

冒泡排序平均是插入排序的3倍时间,所以一般用插入排序

}
要求不用指针,只用数组乱序输絀时为两个5乘6的矩形。... 要求不用指针,只用数组乱序输出时为两个5乘6的矩形。

为什么不放个例子出来让人更加明白! 不太明白你的意思!

 

 

就按照平时的排序就可以了,

你对这个回答的评价是

}
要求不用指针,只用数组乱序输絀时为两个5乘6的矩形。... 要求不用指针,只用数组乱序输出时为两个5乘6的矩形。

为什么不放个例子出来让人更加明白! 不太明白你的意思!

 

 

就按照平时的排序就可以了,

你对这个回答的评价是

}

我要回帖

更多关于 数组乱序 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信