近段时间一直在阅读《数据结构与算法JavaScript描述》这本书,重新学习下算法。算法是作为一个程序员的基本素养,还是掌握一些基本的算法的,譬如排序算法。排序算法又分为基本排序算法和高级排序算法,以排序的效率来划分。以下的冒泡排序就是基本排序算法,最慢的排序算法之一。

最慢的排序算法之一,数据值会像气泡一样从数组的一端飘向另一端。之所以会产生这种现象是因为算法会多次在数组中移动,比较相邻的数据,假设按升序排序,则当左侧值大于右侧值时将它们进行互换。
示例代码:

  1. function bubbleSort(arr){
  2. var length = arr.length;
  3. // 数组交换方法
  4. var swap = function(arr,index1,index2){
  5. var temp = arr[index1];
  6. arr[index1] = arr[index2];
  7. arr[index2] = temp;
  8. }
  9. // 外循环则表示相邻比较的次数,比较一次后,最大的数会移向最右侧,则次数减一,进行下一轮循环
  10. for(var outer = length; outer >= 2; --outer){
  11. // 内循环则表示从第一个数值开始相邻比较,一直到最后一个
  12. for(var inner = 0; inner< outer; ++inner){
  13. if(arr[inner]>arr[inner+1]){
  14. swap(arr,inner,inner+1);
  15. }
  16. }
  17. }
  18. return arr;
  19. }

选择排序从数组的开头开始,将第一个元素和其它元素进行比较。检查完所有的元素后,最小的元素会被放到数组的第一个位置,然后算法会在第二个位置继续。这个过程一直进行,当进行到数组倒数的第二个位置时,所有的数据便完成了排序。选择排序会用到嵌套循环。外循环从数组的第一个元素移动到倒数第二个元素,因为是从第一个跟其它元素比较,所以循环到倒数第二个时,则与最后一个元素比较。内循环则从第二个数组元素移动到最后一个元素,查找比当前外循环所指向的元素小的元素。
示例代码:

  1. function selectionSort(arr){
  2. var min;
  3. var swap = function(arr,index1,index2){
  4. var temp = arr[index1];
  5. arr[index1] = arr[index2];
  6. arr[index2] = temp;
  7. }
  8. for(var outer = 0; outer <= arr.length-2;++outer){
  9. min = outer;
  10. for(var inner = outer+1; inner <= arr.length-1;++inner){
  11. if(arr[inner]<arr[min]){
  12. min = inner;
  13. }
  14. swap(arr,outer,min);
  15. }
  16. }
  17. return arr;
  18. }

插入排序类似于人类按数字或字母顺序对数据进行排序。插入排序有两个循环。外循环将数组挨个移动,而内循环则对外循环选中的元素及它后面的那些元素进行比较。如果外循环选中的元素比内循环中选中的元素小,则数组会向右移动,为内循环中的这个元素腾出位置。外循环从第二个元素开始,因为默认与第一个比较,比较完后,从三个元素开始与前面两个元素进行比较,后面的以此类推,如果比前面的元素大则不用换位置,否则向前面插入,后面的元素往后移动。
示例代码:

  1. function insertionSort(arr){
  2. var temp,inner;
  3. for(var outer = 1; outer <= arr.lengtn -1 ; ++outer){
  4. temp = arr[outer];
  5. inner = outer;
  6. while(inner > 0 && arr[inner-1] >= temp ){
  7. arr[inner] = arr[inner-1];
  8. —-i;
  9. }
  10. arr[inner] = temp;
  11. }
  12. }

经测试,对于100个元素执行排序,三种算法没有显著差别。
对于10000个元素排序,选择排序和插入排序要比冒泡排序快,插入排序是这三种算法最快的。

版权声明:本文为GeniusLyzh原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/GeniusLyzh/p/9548587.html