1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
|
/**************************************************************************/
/* */
/* The Why platform for program certification */
/* Copyright (C) 2002-2008 */
/* Romain BARDOU */
/* Jean-Franois COUCHOT */
/* Mehdi DOGGUY */
/* Jean-Christophe FILLITRE */
/* Thierry HUBERT */
/* Claude MARCH */
/* Yannick MOY */
/* Christine PAULIN */
/* Yann RGIS-GIANAS */
/* Nicolas ROUSSET */
/* Xavier URBAIN */
/* */
/* This software is free software; you can redistribute it and/or */
/* modify it under the terms of the GNU General Public */
/* License version 2, as published by the Free Software Foundation. */
/* */
/* This software is distributed in the hope that it will be useful, */
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. */
/* */
/* See the GNU General Public License version 2 for more details */
/* (enclosed in the file GPL). */
/* */
/**************************************************************************/
/* Insertion sort */
#include "sorting.h"
/*@ requires \valid(a+i) && \valid(a+j)
@ assigns a[i], a[j]
@ ensures Swap(contents(a), \old(contents(a)), i, j)
@*/
void swap(int* a, unsigned int i, unsigned int j) {
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
/*@ requires n >= 0 && \valid_range(a, 0, n-1)
@ assigns a[0..n-1]
@ ensures Sorted(a,0,n-1) && Permut(contents(a), \old(contents(a)), 0, n-1)
@*/
void selection(int a[], unsigned int n) {
unsigned int i, j, min;
if (n <= 1) return;
/*@ // a[0..i-1] is already sorted
@ invariant
@ 0 <= i <= n-1 &&
@ Sorted(a, 0, i-1) &&
@ Permut(contents(a), \at(contents(a), init), 0, n-1) &&
@ \forall integer k; \forall integer l;
@ 0 <= k < i => i <= l < n => a[k] <= a[l]
@ loop_assigns
@ a[0..n-1]
@ variant
@ n - i
@*/
for (i = 0; i < n-1; i++) {
/* we look for the minimum of a[i..n-1] */
min = i;
/*@ invariant
@ i+1 <= j <= n &&
@ i <= min < n &&
@ \forall int k; i <= k < j => a[min] <= a[k]
@ variant
@ n - j
@*/
for (j = i + 1; j < n; j++) {
if (a[j] < a[min]) min = j;
}
/* we swap a[i] and a[min] */
swap(a,min,i);
}
}
/* test
int main() {
int i;
int t[10] = { 3,5,1,0,6,8,4,2,9,7 };
selection(t, 10);
for (i = 0; i < 10; i++) printf("%d ", t[i]);
}
*/
/*
Local Variables:
compile-command: "make selection.gui"
End:
*/
|