[Algorithm] Swap Two Values
Categories: Algoritma, Programming | May 13th, 2008 | by Felix J | 10 Comments2. 2 Variabel, Perhitungan !
Boleh dikatakan bahwa cara ke-2 ini akan lebih ribet karena menggunakan perhitungan matematis… ![]()
tapi, perhitungan matematis ini sebenarnya hanya melibatkan operator tambah dan kurang saja… terlebih lagi kita tidak membutuhkan sebuah variabel tambahan
Kita asumsikan bahwa variabel a memiliki nilai 2 dan b memiliki nilai 3… maka caranya adalah kita buat variabel a memiliki nilai hasil tambah dari variabel a dan b yaitu menjadi 5, dan variabel b tetap memiliki nilai 3. kemudian, variabel b kita buat agar menyimpan hasil dari nilai variabel a dikurang variabel b, yaitu 5 - 3 = 2… sampai disini, maka variabel a kita buat agar menyimpan hasil dari variabel a dikurang variabel b yaitu 5 - 2 = 3… maka setelah proses ini selesai, nilai dari variabel a dan b akan tertukar
oleh karena itu, logika diatas dapat dibuat menjadi kode
1 2 3 4 5 6 | void swap(int &a, int &b) { a += b; b = a - b; a -= b; } |
Sebagai catatan, algo diatas tidak akan bisa berjalan jika (a+b) > (2^32 -1). Jadi diharapkan untuk berhati-hati… jika nilai a dan b bisa melebihi batas integer, bisa dipakai intger 64 bit… int64 (minGW), atau long long (GCC)
Setelah ini, apakah anda tertarik untuk membahas algoritma tercepat untuk tukar nilai ini??
Algoritma ke-3 akan sedikit rumit karena bukan melibatkan perhitungan. melainkan dengan cara menggeser ‘bits’
Tertarik? Silahkan buka halaman selanjutnya apabila anda masih sanggup
Jika tidak, stop lah sampe sini
:P Hehehehe….
passing parameter fungsinya bisa pake alias:
void swap(int &a, int &b) {
a ^= b;
b ^= a;
a ^= b;
// code di atas bisa juga disingkat jadi:
// a ^= b ^= a ^= b;
}
void main() {
int a = 5, b = 7;
swap(a, b);
}
anyway, good article
wah wahhh… ada om shu disini…
Ok dhe.. tar ku update ini articlenya
ditambahin dengan tambahan dari om shu
Thx masukannya Om…
hehehehe..
Challenge untuk cara ke-2 (yang nge swap pake + -):
void swap(int &a, int &b){
a += b;
b = a - b;
a -= b;
}
int main() {
int a = 1000000000;
int b = 2000000000;
printf(”Sebelum: a = %d, b = %d\n”, a,b);
swap(a,b);
printf(”Sesudah: a = %d, b = %d\n”, a,b); // hasilnya berapa?
}
Wah wah… kalo untuk GCC (32 bit compiler), sih fungsi tersebut jalan, tapi mungkin untuk 16 bit compiler, keknya ada error dhee…
Bner gk kk?
Oh haha.. gak jadi deh… kirain bisa overflow di 32 bit. Algo diatas bener untuk 32 bit maupun 16 bit kalau a dan b tidak overflow sebelum di swap.
yupp… tapi sih algo yang tambah kurang itu, kalo di coba untuk a misalkan 3 miliar dan b juga 3 miliar, tentunya sih error… karena lebih dari 2^(32-1) (2.147.483.648)
ok, aku tambahkan
Thx kk Felix untuk ngingetin ttg overflownya…
wa,,,,ternyata ko felix sudah post juga n lebih lengkap lagi.
blognya kog ada 2. yang aktif yang mana ni?
yang blog-sally itu punya pacarku
ini punyaku sendiri… ohh.. jangan panggil saya ‘ko’.. felix aja ato felix j jg boleh… *kalo felix doang ketuker ma felix halim
*
baru juga lulus SMA, dah di panggil ‘ko’ haduh… tua skali aku T_T
btw, thx dah kunjungin blog kuw.. smoga makin nambah ilmu… hehehe…
sorry ni. gq kirain felix halim. makanya gw panggil ko. iya d, gw panggil felix. heeee,,,,,
wahahhaha…. as i thought
beda orang kk… walau emang aku dan felix halim itu dekat dan saling kenal.. tapi ttp aja beda orang… hehehhe… dia itu yang ngajarin aku algo sampe lebih dalem…. 
kalo yang ini Felix J… makanya tiap post pasti ku cantumin “J” biar gk kesandung ma “Felix H” :))
felix halim tuh dia cman ada 1 kok url nya… felix-halim.net