算法简介
二分查找:基于有序数组开展
大O表示法:时间复杂度空间复杂度,主要用于衡量随着n的变化,时间复杂度和空间复杂度的增速
选择排序
数组、链表:两者在数据存取方面的时间复杂度的区别,
选择排序:
原理:每次遍历序列获取最大、或最小的元素,;循环遍历,所有元素
递归
递归:自己调用自己的函数,递归和循环实现原理相同,只是表现形式不同,递归的形式可读性更好,但占用的调用栈内存更大,循环的内存消耗更小
递归包含:基线条件、循环条件
快速排序
例如前面提到的二分查找,一些操作是基于有序序列的,所以需要对数据进行排序
分而治之:有时遇到已有算法无法解决的问题,应该尝试已有的解决办法找出解决方式,分而治之是一种重要的解决思路
快排:基于分而治之的思路,
基线条件:数据的长度<2,不需要排序;
循环:数据长度>=2,将数据分为三部分:<pivot的数组,pivot,>pivot的数组,
对于pivot左右的数组,继续采用分治思路拆分,知道满足基线条件;
再将排好序的子数组和pivot,拼接好返回;
分而治之的原理:
找到基线条件
确定如何缩小问题的规模,使其符合基线条件
通过实现比较快排和归并排序的时间复杂度
算法实现
选择排序
var chooseSort = function (arr){
if(!arr||arr.length<2){
return arr;
}
var max = arr[0],index=0;
for(var i=0;i<arr.length;i++){
max = arr[i];
index=i;
for(var j=i+1;j<arr.length;j++){
if(arr[j]>max){
max=arr[j];
index=j;
}
}
swap(arr,i,index);
}
return arr;
}
var swap=function(arr,i,index){
var temp = arr[i];
arr[i]=arr[index];
arr[index]=temp;
}
快排
var DC_sort = function (left,right,arr){
var pivot = arr[left];
while (left<right){
while (left<right&&arr[right]>=pivot) right--;
arr[left] = arr[right];
while (left<right&&arr[left]<=pivot) left++;
arr[right] = arr[left];
}
arr[left]=pivot;
return left;
}
var quickSort = function (low,high,arr){
if(low>=high){
return;
}
var positon = DC_sort(low,high,arr);
quickSort(low,positon-1,arr);
quickSort(positon+1,high,arr);
return arr;
}
var arr=[7,8,3,5];
console.log(quickSort(0, arr.length - 1, arr));