Advertisement
Guest User

Untitled

a guest
Jul 5th, 2017
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Eiffel 2.49 KB | None | 0 0
  1. note
  2.     description: "Summary description for {ARRAY_SORTABLE}."
  3.     author: ""
  4.     date: "$Date$"
  5.     revision: "$Revision$"
  6.  
  7. class
  8.     ARRAY_SORTABLE [G -> COMPARABLE]
  9.  
  10. inherit
  11.     ARRAY [G]
  12.  
  13. create
  14.     make
  15.  
  16. feature -- Sorting
  17.  
  18.     selection_sort
  19.         -- Sort current area using selection sort algorithm
  20.         local
  21.             i: INTEGER
  22.         do
  23.             from
  24.                 i:= lower
  25.             invariant
  26.                 valid_index (i) or i = upper + 1
  27.                 i /= lower implies is_sorted(lower, i-1)
  28.             variant
  29.                 upper - i + 1
  30.             until
  31.                 i > upper
  32.             loop
  33.                 swap(i, get_minimun_index(i, upper))
  34.                 i:=i+1
  35.             end
  36.         ensure
  37.             same_count: old count = count
  38.             stable_lower: lower = old lower
  39.             stable_upper: upper = old upper
  40.             is_sorted(lower,upper)
  41.         end
  42.  
  43.     get_minimun_index (start_pos, end_pos: INTEGER): INTEGER
  44.         -- Get the index with minor value bounds start_pos and end_pos.
  45.         require
  46.             valid_start_pos: valid_index (start_pos)
  47.             valid_end_pos: end_pos <= upper
  48.             valid_bounds: (start_pos <= end_pos) or (start_pos = end_pos + 1)
  49.         local
  50.             i: INTEGER
  51.         do
  52.             result := start_pos
  53.             from
  54.                 i := start_pos
  55.             invariant
  56.                 valid_index (i) or i = end_pos + 1
  57.             variant
  58.                 end_pos - i + 1
  59.             until
  60.                 i > end_pos
  61.             loop
  62.                 if area[i-lower] <= area[result-lower] then
  63.                     result := i;
  64.                 end
  65.                 i:=i+1
  66.             end
  67.         ensure
  68.             same_count: old count = count
  69.             stable_lower: lower = old lower
  70.             stable_upper: upper = old upper
  71.         end
  72.  
  73.     swap(index_1: INTEGER; index_2:INTEGER)
  74.         -- Intercambia los valores en el arreglo
  75.         require
  76.             valid_index: valid_index (index_1)
  77.             valid_index: valid_index (index_2)
  78.         local
  79.             aux : G
  80.         do
  81.             aux:= area[index_1-lower]
  82.             area[index_1 - lower] := area[index_2 - lower]
  83.             area[index_2 - lower] := aux
  84.         ensure
  85.             same_count: old count = count
  86.             stable_lower: lower = old lower
  87.             stable_upper: upper = old upper
  88.             old area[index_1 - lower] = area[index_2 - lower]
  89.             old area[index_2 - lower] = area[index_1 - lower]
  90.         end
  91.  
  92.     is_sorted (start_pos, end_pos: INTEGER): BOOLEAN
  93.         -- Return true if current area is sorted increasingly
  94.         require
  95.             valid_start_pos: valid_index (start_pos)
  96.             valid_end_pos: end_pos <= upper
  97.             valid_bounds: (start_pos <= end_pos) or (start_pos = end_pos + 1)
  98.         local
  99.             i: INTEGER
  100.         do
  101.             Result := True
  102.             from
  103.                 i := start_pos
  104.             invariant
  105.                 valid_index (lower + i)
  106.             variant
  107.                 end_pos - i + 1
  108.             until
  109.                 i = end_pos or not Result
  110.             loop
  111.                 Result := ( area[i-lower] <= area[(i - lower) + 1])
  112.                 i := i + 1
  113.             end
  114.         end
  115.  
  116. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement