I would use a squarish (is it written like that?) function.
Maybe something like (-(x-1)?+1)*n , where x is a time factor and n is the time the jump button was pressed.
The correct term is "parabolic," but I get what you're saying.
I was thinking about this, and the only problem is that speed/position would dramatically drop. If you graph two parabolas, one normal and one with a high amount of compression, there is going to be a huge discrepancy between a value at, say, x = 2. Where one graph might give you a value of 8 at 2, the other might give you a value of 2, meaning you'd be dropping from 8 to 2 in an instant.
It would be a lot smoother than just always going straight to 0, though, and if the range of values is not significantly large, the change in speed will be negligent and should end up looking better.
But this also requires using a timeline. What you would probably want to use is this:
-(x^2)*(current y position)/(current y position + jump height)
This way, you will always be stopping with an accurate fraction of the jump.
Of course, a parabola goes on until infinity, so this equation won't just plug in for your jump.
Also, you should enclose your jump code in an if block which makes sure that you aren't falling down:
if(!vspeed < 0) {
code
}
This way, you aren't defying gravity moreso than usual.