一.冒泡排序
冒泡排序(Bubble Sort) 最为简单的一种排序,通过重复走完数组的所有元素,通过打擂台的方式两个两个比较,直到没有数可以交换的时候结束这个数,再到下个数,直到整个数组排好顺序。
原理:相邻的两个单位,比较存储的数据,如果第一个单元的数据较大,就将两个相邻单元,交换存储数据。
核心:
交换存储的数据
两个相邻的单元,比较数据大小,第一个单元数值较大,就交换两个单元存储的数据
过程:
从起始单元开始比较,第一次循环,会选择出一个最大值,放在数组所有单元的最后
之后,每次循环,都会比较出一个本次循环的最大值,放在当前参与比较单元的最后
之前已经比较选出的单元,不会参与下一次比较
for(var j = 0 ; j <= (arr.length-1) -1 ; j++){
for (var i = 0; i <= (arr.length-1) -1 - j ; i++) {
if (arr[i] > arr[i + 1]) {
// 交换存储的数据
var middle = 0;
middle = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = middle;
}
}
}
console.log(arr);
代码优化:
- 单次循环,最后一个单元,通过倒数第二个单元,参与比较,最后一个单元,就不参与单次循环
- 之前比较出的最大值,不再参与下一次的比较
- n个单元,只要循环比较n-1次,最后就一个单元时,不要再循环比较
二.选择排序
选择排序是直观的排序,通过确定一个 Key 最大或最小值,再从带排序的的数中找出最大或最小的交换到对应位置。再选择次之。
原理:
先定义循环的起始位置默认为最小值所在位置
从起始位置下一个位置开始,执行循环
如果有位置上的数值,小于,存储索引位置上的数值
就存储这个位置的索引值
循环结束,比较存储的索引,是否是起始位置索引
如果不是,就交换两个位置上的数值
会将本次循环的最小值,放置在循环的起始位置上
再执行多次循环,完成排序
核心 : 找到最小值的索引,与起始位置交换数值,先找索引 在交换数值
var arr = [3,44,38,5,47,25,36,2,79,8,1];
for(var j = 0 ; j <= arr.length-1 -1 ; j++){
var min = j;
for(var i = j+1 ; i <= arr.length-1 ; i++){
if(arr[min] > arr[i]){
min = i;
}
}
if(min != j){
var m = 0;
m = arr[j];
arr[j] = arr[min];
arr[min] = m;
}
}
console.log(arr);
代码优化 :
1.之前比较的数值不参与一次标记
2.n个单元,只要比较n-1次