2015-11-25 44 views
2

我在教程網頁上在線找到了合併排序算法的示例,我一直試圖理解代碼是否實現了該算法。我發現的例子使用遞歸和臨時數組來排序未排序算法的數組。 我的查詢是在這個過程的最後一步。將臨時數組的元素複製到原始數組中以對數組進行排序時。爲什麼算法遞減正確的屬性而不是增加左側屬性?當我增加左側左值時,算法不起作用。合併排序執行查詢

class Assignment1 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine("Size of array:"); 
     int n = Convert.ToInt16(Console.ReadLine()); 
     int[] unsorted = new int[n]; 

     for(int i = 0; i < n; i++) 
     { 
      Console.WriteLine("Enter a number:"); 
      unsorted[i] = Convert.ToInt16(Console.ReadLine()); 
     } 

     Console.WriteLine("--------Sort---------"); 

     Recursion_Sort(unsorted, 0, n - 1); 
     for (int i = 0; i < n; i++) 
     { 
       Console.WriteLine(unsorted[i]); 
     } 
    } 

    static public void Merge(int[] numbers, int left, int mid, int right, int n) 
    { 

     int[] tempArray = new int[n]; 

     int i, lEnd, size, pos; 



     lEnd = mid - 1; 
     pos = left; 
     size = (right - left + 1); 


     while ((left <= lEnd) && (mid <= right)) 
     { 

      if (numbers[left] <= numbers[mid]) 
      { 

       tempArray[pos] = numbers[left]; 
       pos++; 
       left++; 
      } 

      else 
      { 

       tempArray[pos] = numbers[mid]; 
       pos++; 
       mid++; 
      } 
     } 



     while (left <= lEnd) 
     { 
      tempArray[pos] = numbers[left]; 
      pos++; 
      left++; 
     } 


     while (mid <= right) 
     { 
      tempArray[pos] = numbers[mid]; 
      pos++; 
      mid++; 
     } 
     Console.WriteLine(tempArray.Length); 


     for (i = 0; i < size; i++) 
     { 
      numbers[right] = tempArray[right]; 
      right--; 
     } 
    } 

    static public void Recursion_Sort(int[] numbers, int left, int right) 
    { 

     int mid; 

     if (right > left) 
     { 
      mid = (right + left)/2; 


      Recursion_Sort(numbers, left, mid); 
      Recursion_Sort(numbers, (mid + 1), right); 
      // we then merge the sorted sub arrays using the merge method 
      Merge(numbers, left, (mid + 1), right, numbers.Length); 
     } 
    } 
} 

回答

1

left值合併過程中改變和你有代碼塊

同時(左< =借給)
{
// ...
左++;
}

left將最後分配給lEnd + 1(條件爲while循環結束)。
否則right不會改變,並且是當前操作序列的最後一個索引。

+0

謝謝@FireAlkazar,這使得很多感覺終於明白髮生了什麼事情 – whiskeycoder

0

以不回答像你想它的問題的風險,我建議LINQ。這不是特別的合併排序,而是兩個數組的連接,然後排序。

如果你的數組不是那麼大以至於性能問題,那麼你可能想要採用這種方法,因爲它很簡單,代碼少(總是很好)。

int[] arr1 = new[] { 1, 2, 3, 7, 8, 10 }; 
int[] arr2 = new[] { 4, 6, 9, 12, 15 }; 

int[] merged = arr1.Concat(arr2).OrderBy(n => n).ToArray(); 

此外,我發佈這個,如果它是其他人感興趣。