From Clomosy Docs

No edit summary
No edit summary
 
Line 139: Line 139:
* [[TclArray]]
* [[TclArray]]
* [[Arrays]]
* [[Arrays]]
{{#seo:|title=Merge Sort in Clomosy - Clomosy Docs}}
{{#seo:|description=A step-by-step guide to implementing this efficient sorting algorithm for optimal data handling.}}

Latest revision as of 11:03, 23 December 2024

The Merge Sort algorithm operates on the divide and conquer principle, working by repeatedly splitting and merging. The array is continuously divided until each element becomes an array of one element. Then, these arrays are merged together in sorted order.
You can see a more concrete representation in the diagram below.


Steps:

  • Split the array into two equal parts.
  • Recursively sort each part using the sorting algorithm.
  • Merge the sorted subsets.

Example

  var
    multiArray: array[6] of Integer; // Fixed size main array
    tempArray: array[6] of Integer; // temporary array
    str: string;
    i : Integer;
    
  function Min(a, b: Integer): Integer;
  {
    if (a < b)
      Result = a
    else
      Result = b;
  }
  
  function Merge(l, m, r: Integer);
  var
    i, j, k: Integer;
  {
    i = l;
    j = m + 1;
    k = l;
  
    while ((i <= m) && (j <= r))
    {
      if (multiArray[i] <= multiArray[j])
      {
        tempArray[k] = multiArray[i];
        Inc(i);
      }
      else
      {
        tempArray[k] = multiArray[j];
        Inc(j);
      }
      Inc(k);
    }
  
    while (i <= m)
    {
      tempArray[k] = multiArray[i];
      Inc(i);
      Inc(k);
    }
  
    while (j <= r)
    {
      tempArray[k] = multiArray[j];
      Inc(j);
      Inc(k);
    }
  
    for (i = l to r)
    {
      multiArray[i] = tempArray[i];
    }
  }
  
  function IterativeMergeSort(n: Integer);
  var
    curr_size, left_start, mid, right_end: Integer;
  {
    curr_size = 1;
    while (curr_size <= n - 1)
    {
      left_start = 0;
      while (left_start < n - 1)
      {
        mid = Min(left_start + curr_size - 1, n - 1);
        right_end = Min(left_start + 2 * curr_size - 1, n - 1);
  
        Merge(left_start, mid, right_end);
  
        left_start = left_start + 2 * curr_size;
      }
      curr_size = 2 * curr_size;
    }
  }
  
  {
    // Populate array with initial values
    multiArray[0] = 12;
    multiArray[1] = 11;
    multiArray[2] = 13;
    multiArray[3] = 5;
    multiArray[4] = 1;
    multiArray[5] = 7;
    str = '';
  
    ShowMessage('Unordered array: ');
    
    for (i = 0 to Length(multiArray)-2)
    {
      str = str + IntToStr(multiArray[i]) + ' '; 
    }
    
    ShowMessage(str);
  
    IterativeMergeSort(Length(multiArray)-1); // Specify array size
  
    str = '';
    
    ShowMessage('Array sorted from smallest to largest: ');
    
    for (i = 0 to Length(multiArray)-2)
    {
      str = str + IntToStr(multiArray[i]) + ' '; 
    }
    ShowMessage(str);
    
    str = '';
    
    ShowMessage('Array sorted from largest to smallest: ');
    
    for (i = Length(multiArray)-2 downto 0)
    {
      str = str + IntToStr(multiArray[i]) + ' '; 
    }
    ShowMessage(str);
    
  }

See Also