算法(Algorithm)可以理解为有基本运算及规定的运算顺序所构成的完整的解题步骤,或者看成按照要求设计好的有限的确切的计算序列,并且这样的步骤和序列可以解决一类问题。算法代表着用系统的方法描述解决问题的策略机制,它能够对一定规范的输入在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。
非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。
线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。
时间复杂度
算法的时间复杂度是指执行算法所需要的计算工作量。因此,问题的规模越大,算法执行的时间的增长率与的增长率正相关,称作渐进时间复杂度(Asymptotic Time Complexity)。
空间复杂度
算法的空间复杂度是指算法需要消耗的内存空间。其计算和表示方法与时间复杂度类似,一般都用复杂度的渐近性来表示。同时间复杂度相比,空间复杂度的分析要简单得多。
这是一种简单的排序算法,通过重复遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
var arr = [1,56,9,6,3,5,8,2]
function sort(arr){
for(let i = 0;iarr[j+1]){
let temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp
}
}
}
return arr
}
sort(arr)
console.log(arr);
算法描述
这是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
var arr = [1,56,9,6,3,5,8,2]
function sort(arr){
for(var i =1;i=0 && arr[last]>val){
arr[last+1] = arr[last]
last--
}
arr[last+1] = val
}
return arr
}
sort(arr)
console.log(arr);
算法描述
快速排序使用分治的原理,它选择一个元素作为"基准",然后将所有其他元素分成两组,第一组包括所有小于基准的元素,第二组包括所有大于或等于基准的元素。然后对这两组进行递归排序。这就是分治策略的基本步骤。
var arr = [1,56,9,6,3,5,8,2]
function quickSort(arr){
if(arr.length<2){
return arr
}
var mid = Math.floor(arr.length/2)
var pivot = arr.splice(mid,1)[0]
var left = [];
var right = [];
for(var i = 0;i
算法描述
归并排序是采用分治法的一个非常典型的应用。归并排序的思想就是先递归分解数组,再合并数组。
var arr = [1,56,9,6,3,5,8,2];
function mergeSort(arr) {
var len = arr.length
if(len<2){
return arr
}
var mid = Math.floor(arr.length/2)
var left = arr.slice(0,mid)
var right = arr.slice(mid)
return merge(mergeSort(left),mergeSort(right))
}
function merge(left,right) {
var result = []
while(left.length>0 && right.length>0){
if(left[0]>right[0]){
result.push(right.shift())
} else {
result.push(left.shift())
}
}
while(left.length){
result.push(left.shift())
}
while(right.length){
result.push(right.shift())
}
arr = result
return arr
}
mergeSort(arr)
console.log(arr);
算法描述
希尔排序是插入排序的一种更高效的改进版本,也称为缩小增量排序。它通过比较相距一定间隔的元素来工作,各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。
var arr = [1,56,9,6,3,5,8,2]
function sort(arr){
var gap = arr.length
for(gap = Math.floor(arr.length/2);gap>0;gap = Math.floor(gap/2)){
for(var i=gap;i=0 && arr[j-gap]>val){
arr[j] = arr[j-gap]
j = j-gap
}
arr[j] = val
}
}
return arr
}
sort(arr)
console.log(arr);
算法描述
堆排序是一种树形选择排序,是对直接选择排序的有效改进。堆的定义如下:具有n个元素的序列(h1,h2,…,hn),当且仅当满足(hi<=h2i,hi<=h2i+1)或(hi>=h2i,hi>=h2i+1) (i=1,2,…,n/2)时称之为堆。在这里只讨论满足hi>=h2i,hi>=h2i+1,且hj>=hk(j>k)的堆称为对于堆排序来说,最重要的一步是将待排序的序列构造成一个大顶堆(或小顶堆)。
var arr = [1,56,9,6,3,5,8,2]
var len;
function buildMaxHeap(arr) {
len = arr.length
for(var i = 0;iarr[largest]){
largest = left
}
if(rightarr[largest]){
largest = right
}
if(largest !== i){
swap(arr,i,largest)
heapify(arr,largest)
}
}
function swap(arr,i,j){
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp
}
function heapSort(arr){
buildMaxHeap(arr)
for(var i = arr.length-1;i>=0;i--){
len-=1;
swap(arr,0,i)
heapify(arr,0)
}
return arr
}
console.log(heapSort(arr));
算法描述
计数排序是一种非比较型的排序算法,适合于对一定范围内的整数排序。它的基本思想是通过为每个整数x计算其出现的次数,得到一个频率表,然后依次输出每个整数x出现的次数,实现排序。
var arr = [1,56,9,6,3,5,8,2];
function countingSort(arr, maxValue){
var bucket = new Array(maxValue+1)
var index = 0
for(var i =0;i0){
arr[index++] = j
bucket[j]--
}
}
return arr
}
console.log(countingSort(arr,56));
算法描述
这是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
var arr = [1,56,9,6,3,5,8,2]
function sort(arr){
for(let i =0;i
算法描述