Пример #1
0
/*@ requires \valid(t + (l..r));
    requires r >= 0;
    requires l >= 0;
    decreases r - l;
    assigns t[l..r];
    ensures Sorted(t, l, r + 1);
    ensures Permut{Old,Here}(t, l, r);
 */
void quick_rec(int t[], int l, int r)
{
   int v, m, i;
   if (l >= r) return;
   v = t[l];
   m = l; 
   /*@ loop invariant 
          \forall integer j; l < j <= m ==> t[j] < v;
       loop invariant
          \forall integer j; m < j <  i ==> t[j] >= v;
       loop invariant  
          Permut{Pre,Here}(t, l, r);
       loop invariant t[l] == v && l <= m < i <= r + 1;
       loop variant r - i;
    */
   for (i = l + 1; i <= r; i++) {
      if (t[i] < v) {
L1:      sort_swap(t, i, ++m);
         //@ assert Permut{L1,Here}(t, l, r);
      }
   }
   //@ assert l <= m <= r;
L: sort_swap(t, l, m);
   //@ assert Permut{L,Here}(t, l, r);
   quick_rec(t, l, m - 1);
   quick_rec(t, m + 1, r);
}
Пример #2
0
void shell_sort(int *tabl, int size)
{
  for (int i = size / 2; i > 0; i /= 2)
    for (int j = i; j < size; j++)
      for (int k = j - i; k >= 0; k -= i)
        if (tabl[k + i] >= tabl[k])
          break;
        else
          sort_swap(tabl, k, k + i);
}
Пример #3
0
void do_heap_sort(int *tabl, int n, int k, int tabl_size)
{
  int i;
  int j;

  while (tabl_size--)
    {
      sort_swap(tabl, 0, tabl_size);
      for (n = 0; (i = (2 * n) + 1) < tabl_size; n = k)
        {
	  j = i + 1;
	  if (j < tabl_size && tabl[i] < tabl[j])
	    k = j;
	  else
	    k = i;
	  if (tabl[n] < tabl[k])
	    sort_swap(tabl, n, k);
	  else
	    break ;
        }
    }
}
Пример #4
0
void heap_sort(int *tabl, int size)
{
  int n;
  int k;
  int tabl_size;
  int tmp;

  for (tabl_size = 1; tabl_size < size; tabl_size++)
    {
      for (n = tabl_size; n; n = k)
        {
	  k = (n - 1) / 2;
	  if (tabl[n] > tabl[k])
	    sort_swap(tabl, n, k);
	  else
	    break ;
        }
    }
  do_heap_sort(tabl, n, k, tabl_size);
}