【问题标题】:JavaScript BubbleSort, how to improve its efficiency?JavaScript BubbleSort,如何提高效率?
【发布时间】: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 个项目。

标签: javascript bubble-sort


【解决方案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 :: Brooks 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--;}
                        }
                    }
                    else{continue;}
        
                }
        
        
        
                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);
        
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2019-04-27
          • 1970-01-01
          • 2013-07-03
          • 2021-05-10
          • 2016-12-18
          • 2018-10-18
          • 1970-01-01
          • 1970-01-01
          • 2022-10-28
          相关资源
          最近更新 更多