【读书笔记】理解基本排序算法
开始日期:2018/07/23
前言
近段时间一直在阅读《数据结构与算法JavaScript描述》这本书,重新学习下算法。算法是作为一个程序员的基本素养,还是掌握一些基本的算法的,譬如排序算法。排序算法又分为基本排序算法和高级排序算法,以排序的效率来划分。以下的冒泡排序就是基本排序算法,最慢的排序算法之一。
冒泡排序
最慢的排序算法之一,数据值会像气泡一样从数组的一端飘向另一端。之所以会产生这种现象是因为算法会多次在数组中移动,比较相邻的数据,假设按升序排序,则当左侧值大于右侧值时将它们进行互换。
示例代码:
function bubbleSort(arr){
var length = arr.length;
// 数组交换方法
var swap = function(arr,index1,index2){
var temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
// 外循环则表示相邻比较的次数,比较一次后,最大的数会移向最右侧,则次数减一,进行下一轮循环
for(var outer = length; outer >= 2; --outer){
// 内循环则表示从第一个数值开始相邻比较,一直到最后一个
for(var inner = 0; inner< outer; ++inner){
if(arr[inner]>arr[inner+1]){
swap(arr,inner,inner+1);
}
}
}
return arr;
}
选择排序
选择排序从数组的开头开始,将第一个元素和其它元素进行比较。检查完所有的元素后,最小的元素会被放到数组的第一个位置,然后算法会在第二个位置继续。这个过程一直进行,当进行到数组倒数的第二个位置时,所有的数据便完成了排序。选择排序会用到嵌套循环。外循环从数组的第一个元素移动到倒数第二个元素,因为是从第一个跟其它元素比较,所以循环到倒数第二个时,则与最后一个元素比较。内循环则从第二个数组元素移动到最后一个元素,查找比当前外循环所指向的元素小的元素。
示例代码:
function selectionSort(arr){
var min;
var swap = function(arr,index1,index2){
var temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
for(var outer = 0; outer <= arr.length-2;++outer){
min = outer;
for(var inner = outer+1; inner <= arr.length-1;++inner){
if(arr[inner]<arr[min]){
min = inner;
}
swap(arr,outer,min);
}
}
return arr;
}
插入排序
插入排序类似于人类按数字或字母顺序对数据进行排序。插入排序有两个循环。外循环将数组挨个移动,而内循环则对外循环选中的元素及它后面的那些元素进行比较。如果外循环选中的元素比内循环中选中的元素小,则数组会向右移动,为内循环中的这个元素腾出位置。外循环从第二个元素开始,因为默认与第一个比较,比较完后,从三个元素开始与前面两个元素进行比较,后面的以此类推,如果比前面的元素大则不用换位置,否则向前面插入,后面的元素往后移动。
示例代码:
function insertionSort(arr){
var temp,inner;
for(var outer = 1; outer <= arr.lengtn -1 ; ++outer){
temp = arr[outer];
inner = outer;
while(inner > 0 && arr[inner-1] >= temp ){
arr[inner] = arr[inner-1];
—-i;
}
arr[inner] = temp;
}
}
基本排序算法的时间复杂度比较
基本排序算法计时比较
经测试,对于100个元素执行排序,三种算法没有显著差别。
对于10000个元素排序,选择排序和插入排序要比冒泡排序快,插入排序是这三种算法最快的。