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
|
/**************************************************************************/
/* */
/* 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
@ 0 <= n && \valid_range(a, 0, n-1)
@ ensures
@ Permut(contents(a), \old(contents(a)), 0, n-1) &&
@ Sorted(a, 0, n-1)
@*/
void insertion_sort(int* a, unsigned int n) {
unsigned int i;
if (n <= 1) return;
/*@ invariant
@ 0 < i <= n &&
@ Permut(contents(a), \at(contents(a), init), 0, n-1) &&
@ Sorted(a, 0, i-1)
@ loop_assigns
@ a[0..n-1]
@ variant
@ n - i
@*/
for (i = 1; i < n; i++) {
int v = a[i];
unsigned int j = i;
/*@ invariant
@ 0 <= j <= i &&
@ Permut(update(contents(a), j, v), \at(contents(a), init), 0, n-1) &&
@ Sorted(a, 0, j-1) &&
@ Sorted(a, j+1, i) &&
@ (j < i => v < a[j+1]) &&
@ (0 < j < i => a[j-1] <= a[j+1])
@ loop_assigns
@ a[0..i]
@ variant
@ j
@*/
while (j > 0 && a[j-1] > v) { a[j] = a[j-1]; j--; }
a[j] = v;
}
}
/* test
int main() {
int i;
int t[10] = { 3,5,1,0,6,8,4,2,9,7 };
insertion_sort(t, 10);
for (i = 0; i < 10; i++) printf("%d ", t[i]);
}
*/
/*
Local Variables:
compile-command: "make insertion.gui"
End:
*/
|