1.1冒泡排序
冒泡排序:就是逐层冒泡第一次执行的冒泡执行比较的次数为当前的长度-1
冒泡的总次数为长度-1,j和j+1比比较完进行位置交换
冒泡的比较次数一次比一次少最后到达一次结束//选择
var arr = [1,3,7,9,4,5,2]
function fn(array){
for(var i=1;i<array.length;i++){//表示冒泡的次数
for(var j=0;j<array.length-i;j++){//表示冒泡的比较的次数
if(array[j]>array[j+1]){//进行比较 array[j]比array[j+1]大 就交换位置
var tem = array[j]
array[j] = array[j+1]
array[j+1] = tem
}
}
}
}
fn(arr)
console.log(arr);//值为[1,2,3,4,5,7,9]
1.2 选择排序
选择排序:每次选择当前的第一个数为最小值
这个值跟后面的所有去比较 然后对应的比我这个值还小的把下标记录起来 将这个下标赋值给min
判断min是否是我前面给到的值 如果是那就不做操作 如果不是那就交换位置
var arr = [1,3,7,9,4,5,2]
function fn2(array){
for(var i=1;i<array.length-1;i++){//length-1就是只剩一个数就不比了
//设置第一个数为最小值
var min = i
for(var j=i+1;j<array.length;j++){
if(array[min]>array[j]){//如果比最小值还小
min = j //使用min记录一下比这个值
}
}
if(min!=i){
//min不指向我们开始指定的下标位置
//换位置
var tem = array[i]
array[i] = array[min]
array[min] = tem
}
}
}
fn2(arr)
console.log(arr);
1.3 插入排序
插入排序:从后外前比
var arr = [1,3,7,9,4,5,2]
function fn3(array){
for(var i=1;i<array.length;i++){
var preIndex = i-1 //获取前一个下标
var current = array[i] //先保存当前的值 为防止
while(preIndex>=0 && current < array[preIndex]){
//如果前一个下标大于等于0和当前的值为小于上一个
array[preIndex+1] = array[preIndex] //将本身这个位置的值赋值为上一个
preIndex-- //递减 继续往前走
}
array[preIndex+1] = current //当前的位置的值等于原本位置的值
}
}
fn3(arr)
console.log(arr);
1.4 快速排序
快速排序:无限二分 找中间值
var arr = [1,3,7,9,4,5,2]
function fn4(arr) {
if (arr.length <= 1) { //长度为1或者小于1退出
return arr
}
var centerIndex = Math.round(arr.length / 2) //取中间值下标
var center = arr.splice(centerIndex, 1)[0] //接收删除的中间值
var left = [] //左边的数组
var right = [] //右边的数组
for (var i = 0; i < arr.length; i++){ //循环遍历
if (arr[i] < center) { //小于中间值 加到左边
left.push(arr[i])
}else {
right.push(arr[i])//大于中间值 加到左边
}
}
return fn4(left).concat([center], fn4(right));//返回合并的数组
}
console.log(fn4(arr));