排序算法中最快的是快速排序算法,搜索算法中最快的是二分搜索算法。
快排
具体算法描述: 三步走
(1)在数据集之中,选择一个元素作为"基准"(pivot)。
(2)所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边。
(3)对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
实现:
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));
};
注:引入阮一峰的一篇文章:http://www.ruanyifeng.com/blog/2011/04/quicksort_in_javascript.html
插入排序
具体算法描述如下:
1)从第一个元素开始,可以认为该元素已经被排序
2)取出下一个元素,在已经排序的元素序列中从后向前进行扫描
3)如果该元素(已排序)大于新元素,讲该元素移到下一个位置
4)重复步骤三,直到找到已排序的元素小于或者等于该元素的位置
5)将新元素插入到该位置
6)重复2~5步骤
实现:
function insertSort(arr) {
//遍历数组
for(var i=1;i<arr2.length;i++){
//声明一个变量用来记录开始比较的位置,并将i位置的值保存在变量t中
var t=arr2[i];
//声明一个变量用来记录i前一个位置保存在变量p中
var p=i-1;
//如果p不为负数且t的值不小于p位置的值就无限循环
while(p>=0&&t<arr2[p]){
//让p位置的值和p+1位置的值交换位置
arr2[p+1]=arr2[p];
//然后让p自减
p--;
}
//当退出循环的时候讲t的值保存在p+1的位置
arr2[p+1]=t;
}
}
冒泡排序
具体算法描述如下:
随便从数组中拿一位数和后一位比较,如果是想从小到大排序,那么就把小的那一位放到前面,大的放在后面。
实现:
function maopao(arra) {
var temp;
for(var i=0;i<arra.length;i++){ //比较多少趟,从第一趟开始
var flag = false
for(var j=0;j<arra.length-i-1;j++){ //每一趟比较多少次数
if(arra[j]>arra[j+1]){
temp=arra[j];
arra[j]=arra[j+1];
arra[j+1]=temp;
flag = true
}
}
if (!flag) {
break
}
};
return arra;
}
冒泡总结 1)外层 for 循环控制循环次数
2)内层 for 循环进行两数交换,找每次的最大数,排到最后
3)设置一个标志位,减少不必要的循环
注:https://segmentfault.com/a/1190000014175918?utm_source=channel-hottest
注:因为一次循环只能交换一个最大的值,所以需要再套一层for循环
注:数组排序可以直接通过数组的API sort()来实现