资讯专栏INFORMATION COLUMN

JavaScript实现常见排序算法

keke / 1842人阅读

这里用JavaScript实现冒泡排序、选择排序、插入排序、归并排序以及快速排序这些常见的排序算法

首先我们给本文约定一个实现的框架:定义一个ArrayList类里面包含排序数组声明、数组元素添加、排序算法实现以及数组输出的方法。

代码框架:

</>复制代码

  1. function ArrayList(){
  2. var array=[];
  3. this.inputArraymember=function(){ //将10个大小在1~15的随机数添加到数组中
  4. var ins=0;
  5. for(var i=0;i<10;i++){
  6. ins=Math.floor(Math.random()*15+1);
  7. array.push(ins);
  8. }
  9. };
  10. this.相应的排序算法=function(){...算法的具体实现代码...}; //代码块替换部分
  11. this.toString=function(separator){ //将数组按指定分隔符生成字符串方便输出
  12. return array.join(separator);
  13. };
  14. }
  15. var a = new ArrayList();
  16. a.inputArraymember();
  17. console.log("随机生成的原始数组为:"+a.toString("-"));
  18. a.bubbleSort();
  19. console.log("排序后数组为:"+a.toString("-"));
冒泡排序

用两层循环,第一层用来记录剩余的还未排序的数的个数,第二层用来在剩下的未排序的数中找到最大的数并将其放到未排序数的最后面(冒泡)。

代码实现:

</>复制代码

  1. this.bubbleSort=function(){
  2. var length=array.length;
  3. for(var i=0;iarray[j+1]){
  4. var t=array[j]; array[j]=array[j+1];array[j+1]=t;
  5. }
  6. }
  7. }
  8. };

冒泡排序的时间复杂度是O(n²)。将以上代码替换文章开始约定的代码框架中的“代码块替换部分”即可用于在调试工具中运行查看代码运行结果。

选择排序

思路很简单,每次都找出未排序的数当中最小的数并放在开头,直到所有数的位置确定下来。说清楚点就是从所有序列中先找到最小的,然后放到第一个位置。之后再看剩余元素中最小的,放到第二个位置……以此类推。

代码实现:

</>复制代码

  1. this.selectsort=function(){
  2. var length=array.length,currentMin;
  3. for(var i=0;iarray[j]){
  4. currentMin=j;
  5. }
  6. }
  7. if(i!==currentMin){ //若下标不是未排序的最开始的那个元素的下标,则将两者的值交换
  8. var t=array[currentMin];
  9. array[currentMin]=array[i];
  10. array[i]=t;
  11. }
  12. }
  13. };

可看出,选择排序也用了两个嵌套着的循环,所以时间复杂度也是O(n²),是一种原址排序。

插入排序

从第二个数开始(因为第一个数只有一个,前面没得比。),与前面的数挨个比较,直到找到前一个数比当前值小,后一个数比当前值大的位置,让后将当前值置于此处,以此类推。

代码实现:

</>复制代码

  1. this.insertsort=function(){
  2. var length=array.length, j,temp;
  3. for(var i=1;i0&&array[j-1]>temp){ //如果这个数比上一个数小,则让上一个数占据现在这个数的位置(右移每个比当前数小的数)
  4. array[j]=array[j-1];
  5. j--
  6. }
  7. array[j]=temp; //直到这个数不比上一个数小的时候,将这个数放在当前的位置
  8. }
  9. };
归并排序

时间复杂度为O(nlogn)。归并用的是分治的思想,将原始数组切分成较小的数组,直到每个小数组只有一个位置,接着讲小数组归并成较大的数组,直到最后只有一个排序完毕的大数组。

代码实现:

</>复制代码

  1. this.mergeSort=function() {
  2. array = mergeSortRec(array);
  3. };
  4. //建堆函数,将数组一直拆分成两部分,直到各部分数组长度都为1的时候停止,然后进行merge操作
  5. var mergeSortRec = function(array){
  6. var length = array.length;
  7. if (length === 1) {
  8. return array;
  9. }
  10. var mid = Math.floor(length / 2),
  11. left = array.slice(0, mid),//slice() 方法可从已有的数组中返回选定的元素,语法 arrayObject.slice(start,end)
  12. right = array.slice(mid, length);
  13. return merge(mergeSortRec(left), mergeSortRec(right));
  14. };
  15. //将各部分进行归并
  16. var merge = function(left, right) {
  17. var result = [],
  18. il = 0,
  19. ir = 0;
  20. while(il < left.length && ir < right.length) {
  21. if (left[il] < right[ir]) {
  22. result.push(left[il++]);
  23. } else {
  24. result.push(right[ir++]);
  25. }
  26. }
  27. //如果il数组还有剩余,则将其剩余部分添加到结果数组中
  28. while (il < left.length) {
  29. result.push(left[il++]);
  30. }
  31. //如果ir数组还有剩余,则将其剩余部分添加到结果数组中
  32. while (ir < right.length) {
  33. result.push(right[ir++]);
  34. }
  35. return result;
  36. };
快速排序

时间复杂度为O(logn)。用的是分治的思想。

代码实现:

</>复制代码

  1. this.quickSort = function(){
  2. quick(array, 0, array.length - 1);
  3. };
  4. var partition = function(array, left, right) { //划分过程
  5. //主元的选择方法最好是随机选择一个数组想或是选择中间项,这里选择中间项
  6. var pivot = array[Math.floor((right + left) / 2)],
  7. i = left,
  8. j = right;
  9. console.log("pivot is " + pivot + "; left is " + left + "; right is " + right);
  10. while (i <= j) {
  11. while (array[i] < pivot) {
  12. i++;
  13. console.log("i = " + i);
  14. }
  15. while (array[j] > pivot) {
  16. j--;
  17. console.log("j = " + j);
  18. }
  19. if (i <= j) {
  20. console.log("swap " + array[i] + " with " + array[j]);
  21. swapQuickStort(array, i, j);
  22. i++;
  23. j--;
  24. }
  25. }
  26. return i;
  27. };
  28. var swapQuickStort = function(array, index1, index2){
  29. var aux = array[index1];
  30. array[index1] = array[index2];
  31. array[index2] = aux;
  32. };
  33. var quick = function(array, left, right){//将子数组分离为较小值数组和较大值数组
  34. var index;
  35. if (array.length > 1) {
  36. index = partition(array, left, right);
  37. if (left < index - 1) {
  38. quick(array, left, index - 1);
  39. }
  40. if (index < right) {
  41. quick(array, index, right);
  42. }
  43. }
  44. return array;
  45. };

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/83069.html

相关文章

  • 常见排序算法JavaScript实现

    摘要:原文译文排序算法的实现译者冒泡排序插入排序选择排序归并排序快速排序译文出处 原文:Sorting Algorithms in Javascript 译文:排序算法的JavaScript实现 译者:dwqs 冒泡排序 let compare = (n1, n2) => n1 - n2; let bubbleSort = (arr, cmp = compare) => { f...

    icattlecoder 评论0 收藏0
  • JavaScript数据结构和算法

    摘要:栈被称为一种后入先出的数据结构。散列使用的数据结构叫做散列表。这些操作需要求助于其他数据结构,比如下面介绍的二叉查找树。 前言 在过去的几年中,得益于Node.js的兴起,JavaScript越来越广泛地用于服务器端编程。鉴于JavaScript语言已经走出了浏览器,程序员发现他们需要更多传统语言(比如C++和Java)提供的工具。这些工具包括传统的数据结构(如链表,栈,队列,图等),...

    EastWoodYang 评论0 收藏0
  • JavaScript算法 ,Python算法,Go算法,java算法,系列之归并排序

    摘要:常见的内部排序算法有插入排序希尔排序选择排序冒泡排序归并排序快速排序堆排序基数排序等。用一张图概括归并排序英语,或,是创建在归并操作上的一种有效的排序算法,效率为。 常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括: showImg(https://segmentfault.com/img/bVNwuO?w=966&h=...

    zhou_you 评论0 收藏0
  • JavaScript算法 ,Python算法,Go算法,java算法,系列之归并排序

    摘要:常见的内部排序算法有插入排序希尔排序选择排序冒泡排序归并排序快速排序堆排序基数排序等。用一张图概括归并排序英语,或,是创建在归并操作上的一种有效的排序算法,效率为。 常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括: showImg(https://segmentfault.com/img/bVNwuO?w=966&h=...

    caoym 评论0 收藏0
  • JavaScript算法 ,Python算法,Go算法,java算法,系列之归并排序

    摘要:常见的内部排序算法有插入排序希尔排序选择排序冒泡排序归并排序快速排序堆排序基数排序等。用一张图概括归并排序英语,或,是创建在归并操作上的一种有效的排序算法,效率为。 常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括: showImg(https://segmentfault.com/img/bVNwuO?w=966&h=...

    microcosm1994 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<