一.冒泡排序(交换储存的数据)
原理:
两个相邻的单元,比较数据大小,第一个单元数值较大, 就交换两个单元存储的数据。
过程:
从起始单元开始比较,第一次循环会选出最大值放 在数组的最后一个单元。并不会再参加以后的比较。
之后每次循环都会比较出剩下的数据中最大的一个,依次从后面排放。
优化:
每次循环,最后一个单元是通过倒数第二个单元进行比较的。不用再次进行循环比较。所以循环次数可以减一。
之前循环比较出的最大值,不在参与下一次的比较
N个单元,只需要循环比较n-1次。
下面附上优化代码与注释:
var arr = [5,8,2,4,3,6,9,7,1]
//因为最后一次排序会确定最后两个数的大小并且排序好,所以次数要减1
for(var j=0;j<arr.length;j++ ){
//内层循环定义i为0,也就是第一个数据
//由于每次最后一个数在倒数第二次就进行了比较,所以没必要在进行一次比较,所以减1
//因为每完成一次循环,每次的最后一个数都已经进行过比较,交换过了,所以循环次数要减去j。
for(var i =0 ;i< arr.length-1-j ; i++){
//第一次循环从索引为0开始去跟索引为1的比较
if(arr[i]>arr[i+1]){
//如果索引为0的大于索引1的数值,那就交换数据
var c = 0;
c= arr[i];
arr[i]=arr[i+1];
arr[i+1]=c;
}
//每次循环找到的此次循环的最大数,并赋值到最后面。
}
console.log (arr);
}
二,选择排序(寻找最小数值的索引,与起始位置交换数值)
代码原理:
1.先定义循环的起始位置,默认为最小值所在位置。
2.从下一个位置开始执行循环,找到最小值的索引值。
3.比较储存的索引值,是否为起始位置的索引
如果不是,就交换两个位置的数值。
会将此次循环的最小值放在循环起始位置
4.通过多次循环,完成排序。
优化:
之前比较晚的数值不参与下一次循环
N个单元,只比较n-1次
下面是代码与注释:
var arr=[5,1,4,2,3,9,8,6,7]
//因为最后一次不需要比较,前一次就比较并排好了 ,所以循环次数是减一。
for(var j = 0 ; j< arr.length-1; j++){
//假设变量的值就是最小数的索引下标
var min = j;
//从min后面开始找比前面数小的数,min的值就是j
//第一次循环j是0,就是从索引下标是1的开始与索引下标是0的比较。所以i=j+1。
for(var i = j+1; i< arr.length;i++){
//这里的if判断是如果前面的数比后面的大,那么就把小的索引下标赋值给min,这样一次一次的赋值,到最后min就是最小数值的索引下标了
if(arr[min]>arr[i]){
min = i;
}
}
//这里如果最小数的索引下标与j不一样,那就做内容交换赋值,
if(min != j){
var c = 0;
c = arr[j];
arr[j]=arr[min];
arr[min]=c
}
//这样循环一次完成一个最小数的排序
}
console.log(arr);
注 优点:
选择排序:每次都是找到最小的索引值后在做一次数据交换
冒泡排序:每次前面一个单元比后面的一个大就会执行一次交换操作,次数高于选择排序。
执行次数过多,会导致执行效率低。
逆战班