开篇

排序是我们日常开发中非常常用的一种操作。目前最经典的排序算法有十种,分别是:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序。下面我们介绍两种最常用的排序算法:冒泡排序和快速排序。

冒泡排序

冒泡排序实现思想比较简单,但是性能较差,适合作为培训教学使用。主要实现思想是:遍历数据中每一个节点,如果不合符我们预期的顺序则和下一个数据交换位置,依此类推。
Javascript排序 - 图1
实现代码如下:

  1. //交换数组元素
  2. function swap(arr,n,n1) {
  3. let temp = arr[n];
  4. arr[n] = arr[n1];
  5. arr[n1] = temp;
  6. }
  7. //冒泡排序
  8. function bubbleSort(arr) {
  9. for(let i=arr.length-1;i>=0;i--) {
  10. for(let j=0;j<i;j++) {
  11. if(arr[j]>arr[i]) {
  12. swap(arr,j,i)
  13. }
  14. }
  15. }
  16. return arr;
  17. }

快速排序

快速排序是已知排序算法中最快的之一,适合数据量较大的时候使用。其主要实现思想是:先取一个基数(一般取数据的中间位置),然后对基数两边的数据分别排序,比基数大的放右边,比基数小的放左边。之后,对左右两边的数据进行以上相同的操作,直到左右两边数据为空。
Javascript排序 - 图2
实现代码如下:

  1. //快速排序
  2. function quickSort(arr) {
  3. let piovtIndex = Math.floor(arr.length/2);
  4. if(arr.length<=1) return arr;
  5. let piovt = arr.splice(piovtIndex,1)[0];
  6. let _left = []
  7. let _right = []
  8. for (var i = 0; i < arr.length; i++) {
  9. let item = arr[i];
  10. if(item<piovt) {
  11. _left.push(item)
  12. } else {
  13. _right.push(item)
  14. }
  15. }
  16. return quickSort(_left).concat([piovt],quickSort(_right))
  17. }

总结

Javascript排序 - 图3
不难看出:两种算法相对比之下,快速排序的所用的操作更少。下面我们用一个例子来验证下这个结论:

  1. var _arr = []
  2. for(let i=0;i<100000;i++) {
  3. _arr.push(Math.ceil(Math.random()*100))
  4. }
  5. // console.log(_arr)
  6. //快速排序
  7. function quickSort(arr) {
  8. let piovtIndex = Math.floor(arr.length/2);
  9. if(arr.length<=1) return arr;
  10. let piovt = arr.splice(piovtIndex,1)[0];
  11. let _left = []
  12. let _right = []
  13. for (var i = 0; i < arr.length; i++) {
  14. let item = arr[i];
  15. if(item<piovt) {
  16. _left.push(item)
  17. } else {
  18. _right.push(item)
  19. }
  20. }
  21. return quickSort(_left).concat([piovt],quickSort(_right))
  22. }
  23. //交换数组元素
  24. function swap(arr,n,n1) {
  25. let temp = arr[n];
  26. arr[n] = arr[n1];
  27. arr[n1] = temp;
  28. }
  29. //冒泡排序
  30. function bubbleSort(arr) {
  31. for(let i=arr.length-1;i>=0;i--) {
  32. for(let j=0;j<i;j++) {
  33. if(arr[j]>arr[i]) {
  34. swap(arr,j,i)
  35. }
  36. }
  37. }
  38. return arr;
  39. }
  40. //测试
  41. let time1 = Date.now()
  42. var a = bubbleSort(_arr)
  43. // console.log(a)
  44. console.log('冒泡排序用时:',Date.now()-time1);
  45. let time2 = Date.now()
  46. quickSort(_arr)
  47. console.log('快速排序用时:',Date.now()-time2);
  48. // 冒泡排序用时: 5373
  49. // 快速排序用时: 533

在数据量为10w时,结果输出为冒泡排序用时5373ms,快速排序用时533ms,两者性能相差10倍之多!


最后附上我的博客地址,欢迎多多交流!