冒泡排序
解析:
1.比较相邻的两个元素,如果前一个比后一个大,则交换位置。
2.第一轮的时候最后一个元素应该是最大的一个。
3.按照步骤一的方法进行相邻两个元素的比较,这个时候由于最后一个元素已经是最大的了,所以最后一个元素不用比较。(每次遍历都会把此次遍历最大的数放在最后,一直到最开始的数)
function sort(arr){
for(var i=0;i<arr.length-1;i++){ //对数组进行循环处理
for(var j=0;j<arr.length-i-1;j++){ //嵌套循环 用剩余的数和最外层的数最对比
if(arr[j]>arr[j+1]){
var max=arr[j];
arr[j]=arr[j+1];
arr[j+1]=max //内循环的数大于外循环的数,交换这两个数的位置,最后这个数组就是从小到大的排序
}
}
}
}
快速排序
解析:
冒泡排序升级版,首先找到中间的数,然后以中间的数为参考,把数组分为左边和右边两个数组 左边的小于中间数,右边的大于中间数,然后进行递归重复上边的操作,把左右两个数组也进行排序 ,最后合并整个所有的数组
例子:
6 1 2 5 9 3 4 7 10 8
第一次排序后
3 1 2 5 4 6 9 7 10 8
左边为 3 1 2 5 4 右边为 9 7 10 8
重复排序后
左边为 1 2 3 5 4 右边为 9 7 8 10
再次排序后
左左为 1 2 左右为5 4 右左 7 右右 9 10
最后排序
左左为 1 2 左右为4 5 右左 7 右右 9 10
最后合并
1 2 3 4 5 6 7 8 9 10
function quickSort(elements) {
if (elements.length <= 1) {
return elements; //判断数组是否为空
}
var pivotIndex = Math.floor(elements.length / 2);//四舍五入取数组中间值的下标
var pivot = elements.splice(pivotIndex, 1)[0];//获取去掉中间值后的数组
var left = []; //左侧放小于中间值的值
var right = [];//右侧放大于中间值的值
for (var i = 0; i < elements.length; i++){
if (elements[i] < pivot) {
left.push(elements[i]);
} else {
right.push(elements[i]);
}
}
//此时第一次结果已经出来了,left为小于中间值的数组,right为大于中间值的数组,
return quickSort(left).concat([pivot], quickSort(right));//然后在使用递归,不断地把left / right数组排序,最后在拼接起来
};
var elements=[5,6,2,1,3,8,7,1.2,5.5,4.5];
alert(quickSort(elements)); //1,1.2,2,3,4.5,5,5.5,6,7,8
插入排序
即假设数组第一个数是已经被排过序的,放入新数组中,之后拿每个数和已经排过序的新数组的每个数做比较,如果大于就在该数后插入,如果小于就在该数前插入
(1) 从第一个元素开始,该元素可以认为已经被排序
(2) 取出下一个元素,在已经排序的元素序列中从后向前扫描
(3) 如果该元素(已排序)大于新元素,将该元素移到下一位置
(4) 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
(5)将新元素插入到下一位置中
(6) 重复步骤2
二分查找
首先判断一个区间,然后在区间里进行循环,找到了就返回下标,没找到就减小区间,直到无法循环 返回-1
//首先找到数组的左右区间
var p=33 //要查找的元素
var arr=[1,2,3,4,5]
var left=0;//左区间端点
var right=arr.length-1;//右区间端点
while(left<=right){
var mid=left+(right-left)/2;//区间正中间的下标
if(p==arr[mid]){
return mid //找到了就返回
}else if(p>arr[mid]){
left=mid+1; //没找到就判断并修改区间范围
}else{
right=mid-1
}
}
return -1 //循环结束还没找到就返回-1