【面试题】
- 给出正整数数组 array = [2,1,5,3,8,4,9,5]
- 请写出一个函数 sort,使得 sort(array) 得到从小到大排好序的数组 [1,2,3,4,5,5,8,9]
- 新的数组可以是在 array 自身上改的,也可以是完全新开辟的内存。
- 不得使用 JS 内置的 sort API
方法一:冒泡算法
冒泡排序算法是一种基于比较的排序算法,其思想是通过相邻元素之间的比较和交换来将一个数组或列表按照从小到大(或者从大到小)的顺序排序。
具体来说,冒泡排序算法的实现过程如下:
- 从第一个元素开始,比较相邻的两个元素大小,如果前一个元素大于后一个元素,则交换它们的位置,从而将较小的元素“冒泡”到数组的前面。
- 继续向后比较相邻元素的大小,重复步骤 1,直到达到数组的最后一个元素。
- 一次冒泡操作会把数组中的最大值(或者最小值)“冒泡”到数组的最后一个位置。因此,重复执行 n-1 次冒泡操作,就可以将整个数组按照要求的顺序排列好。
冒泡排序算法的时间复杂度为 O(n^2),其中 n 是数组中元素的个数。该算法的优点是实现简单,缺点是效率较低,在大规模数据排序时不建议使用。
答案:
var array = [2,1,5,3,8,4,9,5];
function sort(array) {
const len = array.length;
for (let i = 0; i < len - 1; i++) {
for (let j = 0; j < len - i - 1; j++) {
if (array[j] > array[j + 1]) {
const temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
return array;
}
console.log(sort(array));
该函数通过双重循环,依次比较相邻的元素,如果前一个元素比后一个元素大,则交换它们的位置。被交换位置的元素将继续与后续元素比较,直到数组被完全遍历。由于每趟冒泡排序都能找出当前数组的最大值,所以每次外层循环时,内层循环比较的元素数量都可以减少,提高了效率。