本文纪录了我在进修前端上的笔记,轻易今后的温习和稳固。
引荐人人去看看这一本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;
}
}
代码块中的解释只是本身的明白,假如有毛病请斧正,多谢列位了