1.冒泡排序
冒泡排序是一种简单的排序算法,它的基本思想是比较相邻的两个元素,如果它们的顺序不对,就交换它们的位置,重复这个过程直到整个数组有序。冒泡排序的实现如下:
//冒泡排序,依次比较相邻两个元素的大小
function bubbleSort(arr)
for (let i=0;i<arr.length;i++){//i=0循环结束后,最大的数字已被放到最后一个
for(let j=0;j<arr.length-i;j++){
if(arr[j]>arr[j+1]){
let temp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
}
}
}
//示例
const arr=[2,3,1,8,4,2,6,2];
console.log(bubbleSort(arr))
平均复杂度:两重for循环,n^2,最好O(n),最坏O(n2)
2.快速排序
快速排序是一种高效的排序算法,它的基本思想是通过分治的方法,将一个大问题划分为小问题来解决。具体来说,快速排序的实现步骤如下:
a. 选取一个基准元素,通常是数组的第一个元素或最后一个元素。
b. 将小于基准元素的元素移动到基准元素的左边,将大于基准元素的元素移动到基准元素的右边。
c. 对基准元素的左侧和右侧分别递归执行步骤 a 和 b。
d. 合并左右两个子数组得到最终结果。
快速排序的实现如下:
function quickSort(arr){
if(arr.length<=0){
return arr;
}else{
const com=[arr[0]];
const left=[];
const right=[];
for (let i=1;i<arr.length;i++){
if(arr[i]>arr[0]){
right.push(arr[i]);
}else if(arr[i]==arr[0]){
com.push(arr[i]);
}else{
left.push(arr[i]);
}
}
return ([...quickSort(left),...com,...quickSort(right)])
}
}
// 示例
const arr = [3, 3, 76, 34, 23, 1];
console.log(quickSort(arr));
平均复杂度:n*logn
3.插入排序
插入排序是一种简单的排序算法,它的基本思想是将数组分为已排序区间和未排序区间,每次从未排序区间中取一个元素,将它插入到已排序区间的适当位置,直到未排序区间为空。
下面是一个使用 JavaScript 实现插入排序的例子:
function insertionSort(arr) {
for (let i = 1; i < arr.length; i++) {
let current = arr[i];
let j = i - 1;
while (j >= 0 && arr[j] > current) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = current;
}
return arr;
}
// example usage:
let arr = [5, 2, 4, 6, 1, 3];
insertionSort(arr); // [1, 2, 3, 4, 5, 6]
在这个例子中,我们定义了一个名为 insertionSort 的函数,它接受一个数组作为参数,并返回一个排好序的数组。该函数使用一个 for 循环来遍历整个数组,从第二个元素开始(因为第一个元素默认已经是有序的)。
在每一次迭代中,我们将当前元素 current 与已排序区间中的元素进行比较,如果当前元素小于已排序区间中的某个元素,则将已排序区间中的元素后移一位。在完成这个过程后,我们将当前元素插入到已排序区间的适当位置。
最后,我们返回排序后的数组。
平均复杂度:O(n^2);最好O(n)最坏O(n2);
4.选择排序
选择排序是一种简单的排序算法,它的基本思想是将数组分为已排序区间和未排序区间,每次从未排序区间中选择最小(或最大)的元素,将它与未排序区间的第一个元素交换位置,直到未排序区间为空。
下面是一个使用 JavaScript 实现选择排序的例子:
function selectionSort(arr) {
for (let i = 0; i < arr.length - 1; i++) {
let minIndex = i;
for (let j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
if (minIndex !== i) {
[arr[i], arr[minIndex]] = [arr[minIndex], arr[i]];
}
}
return arr;
}
// example usage:
let arr = [5, 2, 4, 6, 1, 3];
selectionSort(arr); // [1, 2, 3, 4, 5, 6]
在这个例子中,我们定义了一个名为 selectionSort 的函数,它接受一个数组作为参数,并返回一个排好序的数组。该函数使用两个嵌套的 for 循环来遍历整个数组。
在外层循环中,我们遍历未排序区间,每次选取未排序区间的第一个元素作为最小值,并记录它的下标。
在内层循环中,我们遍历未排序区间的其他元素,如果发现有比当前最小值更小的元素,则更新最小值的下标。
在完成内层循环后,我们通过交换最小值和未排序区间的第一个元素来将最小值放到已排序区间的末尾。
最后,我们返回排序后的数组。
选择排序的时间复杂度为 O(n^2),因为它需要遍历整个数组,并且每次遍历都需要进行一次交换操作。但是,选择排序的空间复杂度比较低,为 O(1),因为它只需要一个额外的变量来记录最小值的下标。