USBASP is probably the cheapest programmer that can be used to program an Arduino and eliminate the need for a bootloader which occupies 2KB in the on-chip flash.
To program an Arduino Uno with a 6-pin ISP connector, the tricky thing is to convert USBASP’s 10-pin connector to 6-pin ISP connector. To program an Arduino Nano or Mini, you need to connect the pins with wires.
For more detailed explanation about pin connection, please refer to this extremely useful article of Bootload the Arduino Mini.
There is an variant of USBASP on market which appears as a HID device and is used with PROGISP, a very nice utility for programming the chip flash and EEPROM as well as many other tasks. The important thing is to setting the FUSE settings correctly depending on the type of Arduino board. The boards.txt in Arduino installation folder is useful for that. The FUSE settings can also make the chip un-readable if you want to protect your firmware a bit.