2013-03-08 27 views
1

我實現希爾排序算法這樣的應用程序:在shell排序中爲受影響的值添加樣式?

shell: function() { 
    var list = anada.vars.$list; 
    for (i = 0; i < list.length; i++) { 
     list[i] = parseInt(list[i], 10); 
    } 
    var n = list.length; 
    var increment = Math.floor(n/2); 
    var i;   

    while (increment > 0) { 
     for (i = increment; i < n; i++) { 
      var temp = list[i]; 
      var j = i; 
      var affectedOne = j; 
      var affectedTwo; 
      while (j >= increment && list[j - increment] > temp) { 
       list[j] = list[j - increment]; 
       j -= increment; 
      } 
      list[j] = temp; 
      var rows = '<tr>'; 
      for (counter = 0; counter < n; counter++) { 
       if (counter > j - increment && counter < i + 1 && counter % increment == 0) { 
        rows += '<td class="affected">' + list[counter]; 
       } else { 
        rows += '<td>' + list[counter]; 
       } 
      } 
      anada.vars.$elements.push(rows); 
     } 
     increment = Math.floor(increment/2); 
     var row = '<tr>'; 
     $.each(list, function(n, val) { 
      row += '<td class="iteration">' + val; 
     }); 
     anada.vars.$elements.push(row); 

    } 
    $('.result-content').find('table').empty(); 
    $.each(anada.vars.$elements, function(n, val) { 
     $('.result-content').find('table').append(val); 
    }); 
    anada.vars.$elements = []; 

}, 

的問題是這樣的:

  1. 排序亮點只有「21」,它不能突出,因爲第一部分, 15和21沒有改變其從入口位置..名單條目是 15,14,0,34,2,44,21,6,7,12,5,34,20。

如果索引0大於索引7,其是半列表+ 1的總數量的,他們會改變位置,更大

這是配對:

第一次迭代: 15-21,14-6 , 0-7, 34-12, 2-5, 44-34, 6-20

我想強調什麼是那些只W¯¯軟管位置發生變化。

first part of the sorting after some iterations, the ending part is like a insertion sort

什麼是我的錯誤。

+3

你能解釋一下這個問題嗎? – Snippet 2013-03-08 06:43:13

+0

啊,好的謝謝.. – 2013-03-08 16:16:34

回答

1

讓我們來努力工作的數學。值i表示您開始向後交換元素的索引。值j是該元素最終結束的位置,increment表示步長。

考慮位置counter上的元素。它被交換與移動如果以下所有條件都爲真元素:

  • counter是許多步驟從j着這的increment的倍數。換句話說,counter >= j && counter - j % increment == 0

  • counter未超過起始點。換句話說,counter <= i

  • 至少移動了一個元素。換句話說,i != j

把此一併產生這種情況:

if (i != j && counter <= i && counter >= j && counter - j % increment == 0) { 
    // Element was swapped 
} else { 
    // Element was not swapped 
} 

,你檢查的條件是接近這一之一,但有一定的off-by-一個錯誤,忘記通過j時移做mod。試試這個,看看是否能解決問題。