一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情。
第七天哟!嘻嘻嘻☺️
前言
身为一个前端小菜鸟,总是有一个飞高飞远的梦想,因此,每点小成长,我都想要让它变得更有意义,为了自己,也为了更多值得的人
开开心心学技术大法~~
来了来了,他真的来了~
正文
首先,我们全局假设数组的长度为n
算法复杂度介绍
算法是计算机语言中不可获取的,算法的复杂度包含时间复杂度和空间复杂度
时间复杂度指该算法运行所需要的时间,空间复杂度指该算法运行所占用的存储空间
十大排序算法
1. 冒泡排序
原理
从左到右相邻的两个数字依次排序,小的放到左边,大的放到右边,第一次循环过后最右边就会是最大的数字;然后再次从左边第二个元素到 n-1 个元素循环,重复上述过程,依次排序,直到排到第一个元素为止。
算法代码
function bubbleSort (list) {
for (let i = 0; i < list.length; i++) {
for (let j = 0; j < list.length - i; j++) {
if (list[j] > list[j + 1]) {
let temp = list[j];
list[j] = list[j + 1];
list[j + 1] = temp;
}
}
}
return list;
}
2. 选择排序
原理
选择左起的第一个数字依次与之后的所有元素比较,并用最小的进行替换。之后选择左起的第二个数字依次循环比较,直到排序完最后一个元素。
算法代码
function selectSort (list) {
for (let i = 0; i < list.length - 1; i++) {
for (let j = i + 1; j < list.length; j++) {
if (list[j] < list[i]) {
let temp = list[i];
list[i] = list[j];
list[j] = temp;
}
}
}
return list;
}
3. 插入排序
原理
前两个元素比较大小,小在左,大在右
将第三个元素和前面两个比较,小在左,大在右
将第四个元素和前面三个比较,小在左,大在右
……
将第n个元素和前面 n-1 个元素比较,小在左,大在右
以上,排序完毕;
算法代码
function insertSort (list) {
for (let i = 1; i < list.length; i++) {
for (let j = i; j > 0; j--) {
if (list[j] < list[j - 1]) {
let temp = list[j];
list[j] = list[j - 1];
list[j - 1] = temp;
}
}
}
return list;
}
4. 快速排序
算法代码
var quickSort = function(arr) {
if (arr.length <= 1) { return arr; }
var pivotIndex = Math.floor(arr.length / 2);
var pivot = arr.splice(pivotIndex, 1)[0];
var left = [];
var right = [];
for (var i = 0; i < arr.length; i++){
if (arr[i] < pivot) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return quickSort(left).concat([pivot], quickSort(right));
};
复杂度:
n*(n-1)/2
最好的情况下排序一次就可以完成排序
最坏的情况就是所有的数组元素都需要排序,这个时候就会退化成冒泡排序,排序次数:n*(n-1)/2
5. 归并排序
原理
将数组递归成单独的元素进行对位两两比较,小的在前,大的在后,对位比较小的插入到数组最前,对位较大的继续与新的对位元素比较,直到本组被排成从小到大的有序数组,然后再依次沿着递归树往上排序,直到合并成一个新的从小到大的有序数组;
原理示意图
排序代码
function mergeSort (list) {
function merge (left, right) {
let list = [];
while (left[0] && right[0]) {
if (left[0] < right[0]) {
list.push (left.shift ());
} else {
list.push (right.shift ());
}
}
list = list.concat (left).concat (right);
return list;
}
function sort (arr) {
if (arr.length === 1) {
return arr;
}
let mid = Math.floor ((arr.length + 1) / 2);
return merge (sort (arr.slice (0, mid)), sort (arr.slice (mid)));
}
return sort (list);
}
6.二分法排序
原理
将左边作为有序序列,右边作为无序序列;从第二个元素开始跟左边做二分法排序
何为二分法?
取左边中点为比较值,无序序列从左到右拿值来跟有序序列的中点值比较,通过大小比较,逐步缩小比较区间,最终将无序序列的值塞入到有序序列正确的位置;
算法代码
var arr = [3,2,23,4,9,1,44,34,9];
function two(){
var len = arr.length;
var left = 0, right = 0, point = 0; //定义三个标记位,point就是最中间的位置
var nArr = [];
nArr[0] = arr[0]; //定义一个数组后,把arr中第一个数先赋给nArr
for(var i=1; i<len; i++){
left = 0;
var nLen = nArr.length;
right = nLen;
for(var j=0; j<nLen; j++){
point = Math.floor((left + right)/2); //取整
if(nArr[point] < arr[i]){
left = point + 1; //注意必须加1
}else{
right = point;
}
if(right == left){ //如果right和left相等就表示找到了插入的位置 ,插入后,跳出循环
nArr.splice(left,0,arr[i]);
break;
}
}
}
console.log(nArr);
}
结语
往期好文推荐「我不推荐下,大家可能就错过了史上最牛逼vscode插件集合啦!!!(嘎嘎嘎~)😄」