冒泡排序
1. 逐层冒泡,第一次执行的冒泡,执行的比较次数为当前的长度 -1
2. 冒泡的总次数为长度 -1
3. 冒泡的比较次数一次比一次 少,最后到达一次结束
var arr = [1,3,8,5,7,6,2]
function bubbleSort(array){
//冒泡的次数
for(var i=1;i<array.length;i++){
for(var j=0; j<array.length-i;j++){ //记录比较的次数
if(array[j]>array[j+1]){ //先比较再进行换位置
var temp = array[j] //先保留j位置的值
array[j] = array[j+1] //将j+1位置的值赋给j位置
array[j+1] = temp //将保存的j位置的值赋给j+1位置
}
}
}
}
bubbleSort(arr)
选择排序
1.每次选择当前的第一个数为最小值
2.这个值跟后面的所有值去比较,然后对应的比我这个值还小的,把下标记录起来,将这个下标赋值给min
3.判断min是否是我前面的给到的值,如果是不做操作,如果不是就交换位置
var arr = [1,3,8,5,7,6,2]
function selectorSort(array){
for(var i =0;i<array.length-1;i++){ //只剩一个数就不比了
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 temp = array[i]
array[i] = array[min]
array[min] = temp
}
}
}
selectorSort(arr)
插入排序
1.从后往前比,初始下表为1
2.第一次比较为1和0比较,比较一次
3.第二次比较为2和1比较,1和0比较,比较两次
.....后面持续递增
第一种方法:
var arr = [1,3,8,5,7,6,2]
function insertSort(array){
for(var i=1;i<array.length;i++){
for(var j=i;j>0;j--){
if(array[j-1]>array[j]){
var temp = array[j-1]
array[j-1] = array[j]
array[j] = temp
}
}
}
}
insertSort(arr)
第二种方法:
function insertion(array){
for(var i=1;i<array.length;i++){
var preIndex = i-1 //获取前一个下标
var current = array[i]; //先保存当前的值,为防止丢失
while(preIndex>0 && current<array[preIndex]){ //如果前一个下标大于等于0和当前的值为小于上一个
arr[preIndex+1] = array[preIndex] //将本身这个位置的值赋值为上一个
preIndex-- //递减 ,继续往前走
}
array[preIndex+] = current //当前的位置的值等于原本位置的值
}
}
insertion(arr)
console.log(arr)
快速排序(冒泡排序升级)
1.快速排序,无限二分法,找中间轴
var arr = [1,3,8,5,7,6,2]
function quickSort(arr){
if(arr.length<=1){ //长度为1或者小于1退出
return arr
}
var centerIndex = Math.round(arr.length/2) //取中间值下标
var center = arr.splice(center,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 quickSort(left).concat([center,quickSort(right)]) //返回合并的数组
}
console.log(quickSort(arr));
2.第二种
function qSort(array){
var max = array.length-1 //定义最大下标
var min = 0 //最小下标
var center = Math.round((max+min)/2)
while(min<max && array[min]<array[center]){ //左边
min++
max = center
center = Math.round(max+min)/2)
}
while(max>min && array[max]>array[center]){ //右边
max--
min = center
center = Math.round((max+min)/2)
}
//判断换位置
if(max==min){
return array
}
}









