Well shifting is definitely the right idea. The only problem is that you still need the temporary that you have in insert sort: otherwise as you end up sliding, you never replace the other value and end up copying data like 1, 1, 1, ... or something like that. To do it right you need to iterate over the entire array anyway, so you might as well sort it.
Code:
#include <stdio.h>
int main( void )
{
double niz[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
const size_t N = sizeof niz / sizeof *niz;
size_t i, j;
niz[N - 1] = 4.56;
for( i = 1; i < N; i++ ) {
double key = niz[i];
for( j = i; j >= 1 && key < niz[j - 1]; j-- ) {
niz[j] = niz[j - 1];
}
niz[j] = key;
}
for( i = 0; i < N; i++ ) {
printf( "%.2f%s", niz[i], i + 1 == N ? "\n" : ", " );
}
return 0;
}
/**out: 1.00, 2.00, 3.00, 4.00, 4.56, 5.00, 6.00, 7.00, 8.00, 9.00 **/
Hopefully that wasn't your homework. But step through the algorithm yourself, ans see that it works.