function quickSort(arr){
if(arr.length<=1) return arr;
var partitionIndex=Math.floor(arr.length/2);
var tmp=arr[partitionIndex];
var left=[];
var right=[];
for(var i=0;i<arr.length;i++){
if(arr[i]<tmp){
left.push(arr[i])
}else{
right.push(arr[i])
}
}
return quickSort(left).concat([tmp],quickSort(right))
}
上述版本会造成堆栈溢出,所以建议使用下面版本
原地分区版:主要区别在于先进行分区处理,将数组分为左小右大
function quickSort(arr){
function swap(arr,right,left){
var tmp = arr[right];
arr[right]=arr[left];
arr[left]=tmp;
}
function partition(arr,left,right){//分区操作,
var pivotValue=arr[right]//最右面设为标准
var storeIndex=left;
for(var i=left;i<right;i++){
if(arr[i]<=pivotValue){
swap(arr,storeIndex,i);
storeIndex++;
}
}
swap(arr,right,storeIndex);
return storeIndex//返回标杆元素的索引值
}
function sort(arr,left,right){
if(left>right) return;
var storeIndex=partition(arr,left,right);
sort(arr,left,storeIndex-1);
sort(arr,storeIndex+1,right);
}
sort(arr,0,arr.length-1);
return arr;
}
排序算法是面试及笔试中必考点,本文通过动画方式演示,通过实例讲解,最后给出JavaScript版的排序算法
插入排序
算法描述
现有一组数组
arr = [5, 6, 3, 1, 8, 7, 2, 4]
编程思路
双层循环,外循环控制未排序的元素,内循环控制已排序的元素,将未排序元素设为标杆,与已排序的元素进行比较,小于则交换位置,大于则位置不动
时间复杂度O(n^2)
选择排序
算法描述
直接从待排序数组中选择一个最小(或最大)数字,放入新数组中。
编程思路
先假设第一个元素为最小的,然后通过循环找出最小元素,然后同第一个元素交换,接着假设第二个元素,重复上述操作即可
时间复杂度
归并排序
算法描述:
编程思路
将数组一直等分,然后合并
时间复杂度
快速排序
算法描述:
在数据集之中,选择一个元素作为”基准”(pivot)。 所有小于”基准”的元素,都移到”基准”的左边;所有大于”基准”的元素,都移到”基准”的右边。这个操作称为分区 (partition)操作,分区操作结束后,基准元素所处的位置就是最终排序后它的位置。 对”基准”左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
上述版本会造成堆栈溢出,所以建议使用下面版本
原地分区版:主要区别在于先进行分区处理,将数组分为左小右大
时间复杂度
冒泡排序
算法描述:
编程思路
外循环控制需要比较的元素,比如第一次排序后,最后一个元素就不需要比较了,内循环则负责两两元素比较,将元素放到正确位置上
时间复杂度
参考资料