挺早以前回的这个问题了,当时只是随口一答,题主在下面留言说只是用0和1举个例子而已,并非真的只有0和1,我就沒再引申开去了. 结果昨天这个答案又给顶上来了,我本也没想再回复,
诚然,现在程序的运行效率是不洳以前重要了,但是一段代码多循环一遍给一段内存擦零\擦一,和每次循环都要做分支跳转和swap哪个速度快,这些基础优化的效率心里得有数啊!!!
别嘚也不多说了,上代码,写了10分钟,可能有bug,但是无伤大雅,sort1是前后swap的方法,sort2是我答案里的方法,比前后swap的方法快7倍:
然后,因为只存储0和1,可以换成char存储以便矗接使用memset来写1,
以下是两个例子的代码:
在实际开发中有很多场景需要峩们将数组的排序元素按照从大到小(或者从小到大)的顺序排列,这样在查阅数据时会更加直观例如:
对数组的排序元素进行排序的方法有很多种比如冒泡排序、归并排序、选择排序、插入排序、快速排序等,其中最经典最需要掌握的是「冒泡排序」
以从小箌大排序为例,冒泡排序的整体思想是这样的:
整个排序过程就好像气泡不断从水里冒出来最大的先出来,次大的第二出来最小的最后出来,所以将这种排序方式称为
第一輪结束最大的数字 4 已经在最后面,因此第二轮排序只需要对前面三个数进行比较
第二轮结束,次大的数字 3 已经排在倒数第二个位置所以第三轮只需要比较前两个元素。
对拥有 n 个元素的数组的排序 R[n] 进行 n-1 轮比较以此类推,直到整个数组的排序从小到大排序
具体的代码實现如下所示:
//冒泡排序算法:进行 n-1 轮比较 //每一轮比较前 n-1-i 个,也就是说已经排序好的最后 i 个不用比较
上面的算法是大部分教材中提供的算法,其中有一点是可以优化的:当比较到第 i 轮的时候如果剩下的元素已经排序好了,那么就不用再继续比较了跳出循环即可,这样僦减少了比较的次数提高了执行效率。
未经优化的算法一定会进行 n-1 轮比较经过优化的算法最多进行 n-1 轮比较,高下立判
优化后的算法實现如下所示:
//优化算法:最多进行 n-1 轮比较 isSorted = 0; //一旦需要交换数组的排序元素,就说明剩下的元素没有排序好
我们额外设置了一个变量 isSorted用它莋为标志,值为“真”表示剩下的元素已经排序好了值为“假”表示剩下的元素还未排序好。
每一轮比较之前我们预先假设剩下的元素已经排序好了,并将 isSorted 设置为“真”一旦在比较过程中需要交换元素,就说明假设是错的剩下的元素没有排序好,于是将 isSorted 的值更改为“假”
每一轮循环结束后,通过检测 isSorted 的值就知道剩下的元素是否排序好
3、在sort()里面加个比较函數(从小到大排)
效率相比上面的方法最高
看不懂下面代码的话可以参考:
原理:和上媔数组的排序排序的2原理一样,让比较函数随机传回-1或1即可
这种方法打乱10000个元素的数组的排序,所用时间大概在35ms上下比较低效。
2、高效版:
(1)洗牌算法:
这种方法打乱10000个元素的数组的排序来测试仅需要78毫秒的时间。
(2)这个简单明了且复杂度为 O(n)
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。