排序是我们在开发过程当中经常会看到也是使用较为频繁的算法,因此掌握一些基本的排序算法对于我们的开发是会有很大的帮助的,以下针对常见的几种排序算法及其原理进行分别介绍。
1、冒泡排序
冒泡排序 原理:从数组的第一个元素开始,把当前元素和下一个索引元素进行比较。如果当前元素大,那么就交换两个元素的位置,重复操作直到比较到最后一个元素为止。该算法也是最简单的最好理解的,针对一些简单的应用场景可以使用冒泡。
// 冒泡排序的核心就是两层for循环
let temp=0;
for(let i=0; i<arr.length; i++){
for(let j=i+1; j<arr.length; j++){
if(arr[i]>arr[j]){
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
};
}
}
2、快速排列
快速排序 原理:快速排序的基本思想是“分治”,“分治”的基本思想是把一个规模为N的问题分解成K个规模较小的子问题,这些子问题的相互独立并且与原问题性质相同,所以可以不断的递归求解。 快速排序的方法如下:
- 在给出的一组数据中选出一个基准值。
- 将这组数据中所有比基准值大的数放在右边,所有比基准值小的数放在左边,分界线就是该基准值。
- 对基准值左右两边的两组数使用同样的方式排序,不断递归,直到所有数据排序完成。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>快速排序</title>
<script>
function quickSort(arr,l,r){
if(l>=r) return;
let i=l,j=r;
// 将第一个数作为基准
let key=arr[l];
// 循环判断,将比基准数小的数都放到基准数左边,比他大的数都放到右边
while(i<j){
// 先从右边往左边判断,如果右边的数大于基准数,则该数位置不变;
// 索引j--,向左移一位,继续判断该位的数是否比key大,大了继续j--;
while(i<j && arr[j]>=key){
j--;
}
// 否则,将右边遇到的比基准数小的这个值赋给之前的arr[i]即key值的位置挖出来的坑,
// 留出arr[j]这个坑,改变方向,从左往右去判断
if(i<j){
arr[i]=arr[j];
i++;
}
// 从左边往右边判断,如果左边的数小于基准数,则索引i++;
while(i<j && arr[i]<key){
i++;
}
// 否则,将左边遇到比基准数大的这个值赋给之前的上一个arr[j]值的位置挖出来的坑,
// 留出arr[i]这个坑,改变方向,从右往左去判断
if(i<j){
arr[j]=arr[i];
j--;
}
}
arr[i]=key; // 这个时候第一次循环停止,i=j,将key放到最后留下的这个坑
// 这个时候,key值左边的数都比它小,右边的数都比它大
// 递归调用处理key值左边的数
quickSort(arr,l,i-1);
// 递归调用处理key值右边的数
quickSort(arr,i+1,r);
}
var arr=[2,1,5,8,4,6,0,7];
quickSort(arr,0,arr.length-1)
console.log(arr);
</script>
</head>
<body>
</body>
</html>
3、选择排序
选择排序 原理:遍历数组,设置最小值的索引为 0,如果取出的值比当前最小值小,就替换最小值索引,遍历完成后,将第一个元素和最小值索引上的值交换。如上操作后,第一个元素就是数组中的最小值,下次遍历就可以从索引 1 开始重复上述操作。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>选择排序</title>
<script>
function selectSort(arr){
// 核心思想:
// 第一次遍历n-1个数,找到最小的数值与第一个元素交换,
// 第二次遍历n-2个数,找到最小的数值与第二个元素交换,
// 类推。。。
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){
let temp=arr[i];
arr[i]=arr[minIndex];
arr[minIndex]=temp;
};
};
}
var arr=[10,0,4,9,22,11,27,7];
selectSort(arr)
console.log(arr);
</script>
</head>
<body>
</body>
</html>
4、插入排序
插入排序 原理:第一个元素默认是已排序元素,取出下一个元素和当前元素比较,如果当前元素大就交换位置。那么此时第一个元素就是当前的最小数,所以下次取出操作从第三个元素开始,向前对比,重复之前的操作。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>插入排序</title>
<script>
function insertSort(arr){
// 核心思想:
// 在要排序的一组数中,假定前n-1个数已经排好序,现在将第n个数插到前面的有序数列中,
// 使得这n个数也是排好顺序的。
// 如此反复循环,直到全部排好顺序。
let temp=0;
for(let i=0; i<arr.length-1; i++){
for(let j=i+1; j>0; j--){
if(arr[j]<arr[j-1]){
temp=arr[j-1];
arr[j-1]=arr[j];
arr[j]=temp;
}else{
// 前面的数组已经有序,如果该数比它的前一个数大,不需要再循环,因此跳出当前循环
break;
}
}
};
}
var arr=[10,0,4,9,22,11,27,7];
insertSort(arr)
console.log(arr);
</script>
</head>
<body>
</body>
</html>