冒泡排序算法JavaScript [关闭]

Posted

技术标签:

【中文标题】冒泡排序算法JavaScript [关闭]【英文标题】:Bubble sort algorithm JavaScript [closed] 【发布时间】:2011-11-22 01:58:22 【问题描述】:

请问你能告诉我在 javascript 中这种冒泡排序算法的实现有什么问题吗?

for (var i=1; i<records.length; i++)
        for (var j=records.length; j<1; j--)
            if (parseInt(records[i-1]) < parseInt(records[i]))
                var temp = records[i-1];
                records[i-1] = records[i]
                records[i] = temp;
               
            
    

【问题讨论】:

如果您告诉我们它的问题是什么,这可能会更好,然后我们也许可以告诉您如何解决它。 【参考方案1】:

冒泡排序的几个代码

冒泡排序不应该用于较大的数组,可以用于较小的数组,因为它很简单。

优化方式,包含所有检查

const bubble_Sort = (nums) => 
  if(!Array.isArray(nums)) return -1; // --->if passed argument is not array
  if(nums.length<2) return nums; // --->if array length is one or less

    let swapped=false
     temp=0,
     count=-1,
     arrLength=0;


    do
      count ++;
      swapped=false;
      arrLength = (nums.length-1) - count; //---> not loop through sorted items
      for(let i=0; i<=arrLength; i++)
          if(nums[i]>nums[i+1])
            temp=nums[i+1];
            nums[i+1]=nums[i];
            nums[i]=temp;
            swapped=true;
          
      
    

    while(swapped)
    return nums;
  
  console.log(bubble_Sort([3, 0, 2, 5, -1, 4, 1]));

方法一

var a = [33, 103, 3, 726, 200, 984, 198, 764, 9];

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);


bubbleSort(a);
console.log(a);

方法二

function bubbleSort(items) 
    var length = items.length;
    //Number of passes
    for (var i = 0; i < length; i++)  
        //Notice that j < (length - i)
        for (var j = 0; j < (length - i - 1); j++)  
            //Compare the adjacent positions
            if(items[j] > items[j+1]) 
                //Swap the numbers
                var tmp = items[j];  //Temporary variable to hold the current number
                items[j] = items[j+1]; //Replace current number with adjacent number
                items[j+1] = tmp; //Replace adjacent number with current number
            
                
    

方法3

function bubbleSort() 
    var numElements = this.dataStore.length;
    var temp;
    for (var outer = numElements; outer >= 2; --outer) 
        for (var inner = 0; inner <= outer-1; ++inner) 
            if (this.dataStore[inner] > this.dataStore[inner+1]) 
                swap(this.dataStore, inner, inner+1); 
        
        console.log(this.toString()); 
    

【讨论】:

方法 3 是错误和部分代码! this.dataStore.length 是什么意思?error codes 在方法1中,在每个交换阶段之后,较大的数字总是向右冒泡,所以在第二阶段,我们可以忽略最后一个元素,类似地在每个阶段之后我们可以减小数组的大小被 1 看。这将减少比较次数: function bubbleSort(a) var swapped, len = a.length; do swapped = false; for (var i=0; i &lt; len; i++) if (a[i] &gt; a[i+1]) var temp = a[i]; a[i] = a[i+1]; a[i+1] = temp; swapped = true; len-- while (swapped); bubbleSort(a); 优化方式拒绝 TypedArray(将返回 -1),尽管该算法适用于 TypedArray。 在优化方案中,应该是i&lt;arrLength而不是i&lt;=arrLength【参考方案2】:

ES6 JavaScript 中的一个简单实现将是

    function BubbleSort(arr) 
      const sortedArray = Array.from(arr);
      let swap;
      do 
        swap = false;
        for (let i = 1; i < sortedArray.length; ++i) 
          if (sortedArray[i - 1] > sortedArray[i]) 
            [sortedArray[i], sortedArray[i - 1]] = [sortedArray[i - 1], sortedArray[i]];
            swap = true;
          
        
       while (swap)
      return sortedArray;
    
console.log(BubbleSort([3, 12, 9, 5]));

【讨论】:

【参考方案3】:

我的解决方案:

  function bubbleSort(A)
  var swapped,
      len = arr.length;

  if(len === 1) return;

  do 
    swapped = false;
    for(var i=1;i<len;i++) 
      if(A[i-1] > A[i])    
        var b = A[i];
        A[i] = A[i-1];
        A[i-1] = b;
        swapped = true;
         
    

  
  while(swapped)  


var arr = [1, 6, 9, 5, 3, 4, 2, 12, 4567, 5, 34];
bubbleSort(arr);
document.write(arr);

【讨论】:

【参考方案4】:

我相信在冒泡排序中,一旦第 i 个循环完成了一次迭代,那么第 i 个元素现在就处于正确的位置。这意味着您应该将 j 循环编写为

for (var j = i + 1; j < records.length; j++)

否则您的冒泡排序将(甚至更)低效。

【讨论】:

【参考方案5】:

第二个for 循环编码错误,应该是

for (var i=0; i<records.length; i++)
    for (var j=0; j<records.length; j++)
        if (parseInt(records[i]) > parseInt(records[j]))
            var temp = records[i];
            records[i] = records[j];
            records[j] = temp;
           
        

【讨论】:

最好将for 循环嵌套在while 循环中,并为循环建立一个谓词。上面的代码将继续循环和循环,直到它结束......即使列表元素已经按顺序放置。 我认为您的代码在最佳情况下也可以工作 O(n2)。拥有这样的代码成本很高。根据这种情况,它不太好。也要坚持复杂性【参考方案6】:

您应该在第二个循环中使用 j 而不是 i,并且不要忘记将 j1

【讨论】:

谢谢你,我想我用 J 代替我 if (parseInt(records[i-1]) &lt; parseInt(records[i])) var temp = records[i-1]; records[i-1] = records[i] records[i] = temp; 我在那儿 是的,你是对的,但后来我得到:TypeError: records[j] is undefined 那是因为你试图访问records[records.length],这个数组中不存在,如果你想从最后开始for循环,你必须从记录开始。长度-1 for (var j=records.length-1; j&gt;0; j--) 【参考方案7】:
for (var j=records.length; j<1; j--)

不应该是这样的

for (var j=records.length; j>1; j--)

【讨论】:

我认为它应该是 (records.length - 1) 因为索引从 0 开始 但是 j 不用作数组的索引;而是用作计数器 这真的是冒泡排序吗?这将如何工作?? 目前不会冒泡排序 - 它只会继续交换第 i 和第 (i - 1) 个元素。我只是指出了他的代码的明显问题(没有进入内部循环的原因)。 是的,我也指出了这一点 :)

以上是关于冒泡排序算法JavaScript [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

冒泡排序有啥用? [关闭]

JavaScript排序算法——冒泡排序

JavaScript 数据结构与算法之美 - 冒泡排序插入排序选择排序

JavaScript实现常见排序算法:冒泡,插入,选择,归并,快速,堆排序

使用JavaScript完成排序算法:冒泡排序选择排序 快速排序

一篇文章搞定javascript冒泡排序