介绍
冒泡排序的思路比较简单,总结下来就是一句话:给你一个数组,如果你能找出其中最大的数,并把它放到这个数组的最后,那么你就能给整个数组排序。
找最大的数-代码实现
function setMaxIndex(source) {
let max = -Infinity;
let maxIndex = -1;
for (let i = 0; i < source.length; i++) {
if (source[i] > max) {
max = source[i];
maxIndex = i;
}
}
// 交换
let temp = source[source.length - 1];
source[source.length - 1] = source[maxIndex];
source[maxIndex] = temp;
}
代码结构比较简单,找到最大的数,然后把这个数放到最后即可
排序
如一个数组中存在10个数,第一次找出了最大的数,剩下只需要重复这个动作即可,即找出这9个数中最大的数,然后把最大的数放在这9个数所组成的数组的最后,直到数组的长度为1,排序停止,代码如下
function sort(arr) {
// 为了更方便的控制数组中的数量,我们对函数做出了一点点小的改变
function setMaxIndex(source, len) {
if (len <= 1) return;
let max = -Infinity;
let maxIndex = -1;
for (let i = 0; i < len; i++) {
if (source[i] > max) {
max = source[i];
maxIndex = i;
}
}
// 交换
let temp = source[len - 1];
source[len - 1] = source[maxIndex];
source[maxIndex] = temp;
}
for (let len = arr.length; len > 0; len--) {
setMaxIndex(arr, len);
}
return arr;
}
标准的冒泡排序
你可能也发现了,这好像和网上给出的冒泡排序代码不一样,正常的冒泡排序,貌似只需要几行代码就可以了。是的,你可以对比一下两份代码,比较它们实现的思路,会发现,它们的核心内容是一样的,在理解之后,你也可以加上自已定义比较函数【谁排在前面,谁排在后面】,来完善这份代码。
时间复杂度
很明显,代码实际上就是2层循环,以10个数据为例,第一次要执行10次【找最大的数】,第二次要执行9次,最后一次,执行1次,那么总的执行次数就是n + (n - 1) + n(- 2) + …… + 1,最后答案是n * (n + 1) / 2,当n特别大时,我们往往忽略其中的1和2,最后得出的计算次数为n方,我们称时间复杂度为O(n2)【O(n方)】
下一章
快速排序