本文记录了我在学习前端上的笔记,方便以后的复习和巩固。
推荐大家去看看这一本gitBook上的书十大经典排序算法本文就是看这本书记录的笔记。
冒泡排序
1.算法步骤
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
2.图片演示:
代码实现:
//数组内两个值互换
function swap(arr, index1, index2) {
var temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
function bubbleSort(arr){
var len = arr.length,i,j;
for(i = 0; i < len - 1; i++){ //进行len-1趟选择(循环),第一趟循环会选出最i个最大记录
//因为i循环已经拿到了最后的数值,i循环一次拿到一次最大的数值所以减i,i = 已被排序好的数值数量
for(j = 0; j < len - 1 - i;){
//比较相邻的数值,如果第一个比第二个大就交换他们。 交换到最后最大数值排在数组最后
if(arr[j] > arr[j+1]){
swap(arr , j, j+1);
}
}
}
return arr;
}
详解
依次比较相邻的两个元素,如果后一个小于前一个,则交换,这样从头到尾一次(外循环一次)就将最大的数放在了数组末尾。
从头到尾再来一次(外循环),由于每进行一轮,最后的都已经是最大的了,因此后一轮需要比较(内循环)的次数可以比上一次少一个(i个)。虽然你还是可以让他从头到尾来比较,但是后面比较都是没有意义的,为了效率,你应该对代码进行优化。
选择排序
1.算法步骤
1.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
2.再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
3.重复第二步,直到所有元素均排序完毕。
2.动图演示
function selectionSort(arr){
var len = arr.length;
var index,temp;
for(var i = 0; i < arr.length - 1; i++){ //进行len - 1趟选择(循环),选择第i个最小记录。
var index = i;
//因为i循环已经拿了最前面的数值 所以j循环复制拿后面的数值和进行对比。
for(var j = i + 1; j < arr.length; j++){
if(arr[j] < arr[index]){ //第一次循环次数的min = 1
index = j; //将最小数的索引保存,选择第i个小记录的下标赋值给min,arr[min]为最小数值
}
}
if(j != index){ //与第i个小记录交换 i和min相同代表已经排序完毕
swap(arr, i, index);
}
}
return arr;
}
示例:假设给定数组A[1......6]={ 3,5,8,9,1,2 },我们来分析一下A数组进行选择排序的过程
第一趟:i=1,index=5, a[1] 和 a[5] 进行交换。得到序列:{ 1,5,8,9,3,2 }
第二趟:i=2,index=6, a[2] 和 a[6] 进行交换。得到序列:{ 1,2,8,9,3,5 }
第三趟:i=3,index=5, a[3] 和 a[5] 进行交换。得到序列:{ 1,2,3,9,8,5 }
第四趟:i=4,index=6, a[3] 和 a[5] 进行交换。得到序列:{ 1,2,3,5,8,9 }
第五趟:i=5,index=5, 不用交换。得到序列:{ 1,2,3,5,8,9 }
(6-1)趟选择结束,得到有序序列:{ 1,2,3,5,8,9 }
插入排序
1.步骤
1.将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
2.从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
2.动图演示
function insertionSort(arr) {
var len = arr.length;
var value;
//循环len趟,外层循环顺序是从数组的第一位到最后一位
for(var i = 1; i < len; i++){
value = arr[i]; //每趟循环拿到第i的数值赋值给Value
//内层顺序是从后往前 j = i - 1会跳过已经排好序的部分。比较后面的数值是否大于前面的数值
for(var j = i - 1; j > -1 && arr[j] > value; j--){
arr[j+1] = arr[j] //满足条件直接交换
}
//因为前面已经排好序直接给value赋值排好序的最后一个
arr[j+1] = value;
}
}
代码块中的注释只是自己的理解,如果有错误请指正,多谢各位了
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。