JavaScript实现常见简单排序算法(冒泡排序,快速排序,直接插入排序,选择排序)
冒泡排序
排序思想
- 数组相邻两项进行比较,如果前一项比后一项大则交换位置,比较arr.length-1轮,每一轮把最大的一项放最后。
- 对除了最后一项之外的其它项重复第一步,直到只剩一项。
动图演示
时间复杂度及空间复杂度
最好情况下时间复杂度:O(n)
最坏情况下时间复杂度:O(n²)
平均时间复杂度:O(n²)
空间复杂度:O(1)
具体代码实现
function bubbleSort(arr){
//控制共比较多少轮
for(var i = 0;i<arr.length-1;i++){
//控制比较次数,每一轮最后一个不用比较
for(var j = 0;j<arr.length-1-i;j++){
if(arr[j]>arr[j+1]){//按从小到大的顺序排序
var temp = arr[j];//借助第三方变量交换位置
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
return arr;
}
console.log(bubbleSort([4,6,2,8,3,0,1,9,7,5]));
快速排序
排序思想
- 以一个数为基准(中间的数),比基准小的放到左边,比基准大的放到右边。
- 再按此方法对这两部分数据分别进行快速排序(递归进行)。
- 不能再分后退出递归,并重新将数组合并。
动图演示
时间复杂度及空间复杂度
最好情况下时间复杂度:O(n log n)
最坏情况下时间复杂度:O(n²)
平均时间复杂度:O(n log n)
空间复杂度:O(log n)
具体代码实现
function quickSort(arr) {
//递归结束判断条件,当被分的数组只剩下一个时,退出递归
if (arr.length <= 1) {
return arr;
} else {
var index = Math.floor(arr.length / 2);//取最中间的那个元素
var mid = arr.splice(index, 1);//中间的那个值即为基准值
var left = [];
var right = [];
//比基准值小的放左边,比基准值大的放右边
for (var i = 0; i < arr.length; i++) {//循环遍历数组
if (arr[i] < mid) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
//递归,然后把数组合并到一起
//debugger
return quickSort(left).concat(mid, quickSort(right));
}
}
console.log(quickSort([4,6,2,8,3,0,1,9,7,5]));
直接插入排序
排序思想
- 把数组分为[已排序]和[未排序]两部分,第一个数为[已排序],其余为[未排序]。
- 再从[未排序]抽出第一个数,和[已排序]部分比较,插入到合适的位置。
动图演示
时间复杂度及空间复杂度
最好情况下时间复杂度:O(n)
最坏情况下时间复杂度:O(n²)
平均时间复杂度:O(n²)
空间复杂度:O(1)
具体代码实现
function insertSort(arr){
for(var i = 1;i < arr.length; i++){//遍历所有的数字
if(arr[i]<arr[i-1]){ //如果当前数字比前一个数字小
var temp = arr[i];//把当前遍历的数字存起来
var j;
//遍历当前数字前面所有的数字,并且当前数字小于前面的数字时
for(j = i-1;j >= 0 && temp < arr[j];j--){
arr[j+1] = arr[j];//把前一个数字给后一个数字,位置变换
}
//把临时变量(外出for循环的当前元素)赋给不满足条件的后一个元素
arr[j+1] = temp;
}
}
return arr;
}
console.log(insertSort([4,6,2,8,3,0,1,9,7,5]));
选择排序
排序思想
- 找出最小的数,和第一个交换位置。
- 在剩下的数中,找出最二小的数,放在第二个。
- 依次类推,排出顺序。
动图演示
时间复杂度及空间复杂度
最好情况下时间复杂度:O(n²)
最坏情况下时间复杂度:O(n²)
平均时间复杂度:O(n²)
空间复杂度:O(1)
具体代码实现
function selectSort(arr){
var min;
//遍历当前数组
for(var i = 0;i < arr.length;i++){
//将当前值设置为最小值
min = i;
//遍历当前数组其余位置是否还有比min更小的值
for(var j = i+1;j < arr.length;j++){
//存在比min更小的值,则把更小的值赋值给min
if(arr[j] < arr[min]){
min = j;
}
}
//如果当前位置不是最小值,将其换为最小值
if(i != min){
var temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}
}
return arr;
}
console.log(selectSort([4,6,2,8,3,0,1,9,7,5]));