JavaScript BubbleSort,如何提高效率?

Posted

技术标签:

【中文标题】JavaScript BubbleSort,如何提高效率?【英文标题】:JavaScript BubbleSort, how to improve its efficiency? 【发布时间】:2011-02-21 22:50:47 【问题描述】:

有一个与此类似的冒泡排序例程。我需要通过在对数组进行排序或数组已经排序时停止循环来提高效率。

function sortNumbers(listbox) 
  var x, y, holder;
  // The Bubble Sort method.
  for(x = 0; x < ranarray.length; x++) 
    for(y = 0; y < (ranarray.length-1); y++) 
      if(ranarray[y] > ranarray[y+1]) 
        holder = ranarray[y+1];
        ranarray[y+1] = ranarray[y];
        ranarray[y] = holder;
      
    
  

【问题讨论】:

如果这不是应该用“作业”标签标记的东西,那么没有太多理由编写这样的代码。 有人赞成这个?真的吗? 为什么不使用更好的算法呢?即使优化的 BubbleSort 仍然是 O(n*n)。是练习还是实际使用? 也许他只是为了学习排序算法而学习。在这种情况下,通常从一个非常简单的算法开始,比如冒泡排序。 ranarray.length-1 应该是 ranarray.length-x 我相信,因为您应该在每次外部迭代后少迭代 1 个项目。 【参考方案1】:

在进入内部循环之前,创建一个布尔值来检查内部循环内部是否发生了交换。当没有交换时,数组被排序。

function sortNumbers(listbox)  
  var x, y, holder; 
  // The Bubble Sort method. 
  for(x = 0; x < ranarray.length; x++)  
    var swapOccured = false;
    for(y = 0; y < (ranarray.length-1); y++)  
      if(ranarray[y] > ranarray[y+1])  
        holder = ranarray[y+1]; 
        ranarray[y+1] = ranarray[y]; 
        ranarray[y] = holder; 
        swapOccured = true;
       
    
    if (!swapOccured) break; 
   

【讨论】:

内循环应该只运行到( ranarray.length - x )【参考方案2】:
var a = [1, 203, 3, 746, 200];

function bubbleSort(a)

    var swapped;
    do 
        swapped = false;
        for (var i=0; i < a.length-1; i++) 
            if (a[i] > a[i+1]) 
                var temp = a[i];
                a[i] = a[i+1];
                a[i+1] = temp;
                swapped = true;
            
        
     while (swapped);

    for(i=0;i<a.length;i++)
    
        document.write(a[i]+"\t");
    


bubbleSort(a);

【讨论】:

【参考方案3】:

检查内部循环中是否发生交换。如果在一次运行期间没有交换,则对列表进行排序。

此外,您可以使用 x 值来确定您需要在内部循环中查看的最后一项。在 x 运行后,最后 x 个项目总是在正确的位置。

function sortNumbers(listbox) 
  var done = false;
  for (var x = 1; !done; x++) 
    done = true;
    for (var y = 0; y < ranarray.length - x; y++) 
      if (ranarray[y] > ranarray[y + 1]) 
        var holder = ranarray[y + 1];
        ranarray[y + 1] = ranarray[y];
        ranarray[y] = holder;
        done = false;
      
    
  

【讨论】:

【参考方案4】:

您可以使用 XOR 来移位数组中的位置;

var arr, len, len2;
    arr = [0, 5, 7, 8, 9, 1, 2, 3, 6, 4];

len = arr.length;

// for loops
for (var i = 0; i < len; i++) 
    for (var j = 0; j < len - 1; j++) 
        if (arr[i] <= arr[j]) 
            arr[i] = arr[i] ^ arr[j];
            arr[j] = arr[j] ^ arr[i];
            arr[i] = arr[i] ^ arr[j];
        
    


// negative while
while (--len) 
    len2 = len;
    while (len2--) 
        if (arr[len] < arr[len2]) 
            arr[len] = arr[len] ^ arr[len2];
            arr[len2] = arr[len2] ^ arr[len];
            arr[len] = arr[len] ^ arr[len2];
        
    

jsperf: http://jsperf.com/sort-tive/4

【讨论】:

【参考方案5】:

高级冒泡排序更高效、更快速,只需一个 for 循环。

 /*Advanced BUBBLE SORT with ONE PASS*/
/*Authored by :: ***s Tare  AAU*/

public class Bubble 

    public int[] bubble(int b[]) 
    int temp,temp1; 

    for(int i=0;i<b.length-1;i++)

            if(b[i]>b[i+1] )
                ///swap(b[i],b[i+1]);

                temp=b[i];
                b[i]=b[i+1];
                b[i+1]=temp;

    /*Checking if there is any number(s) greater than 
      the current number. If there is swap them.*/
                while(i>0)

                    if(b[i]<b[i-1])
                    ///swap(b[i]<b[i-1])

                        temp1=b[i];
                        b[i]=b[i-1];
                        b[i-1]=temp1;
                        i--;
                    
                    else if(b[i]>b[i-1])i--;
                
            
            elsecontinue;

        



        return b;
    
///the following is a function to display the Array 
        public void see(int []a)
            for(int j=0;j<a.length;j++)
                System.out.print(a[j]+",");
            
        



    public static void main(String []args)
        ///You can change the Array to your preference.. u can even make it dynamic 

        int b[]=5,1,4,2,0,3; 
        int v[]=new int[100]; 
        Bubble br=new Bubble();
        v=br.bubble(b);
        br.see(v);

    

【讨论】:

以上是关于JavaScript BubbleSort,如何提高效率?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript模拟的HashMap,请大家多多提意见!

Javascript:冒泡排序

为啥会这样? (冒泡排序)[JavaScript]

Javascript如何实现AOP

冒泡排序BubbleSort

BubbleSort