SINGHA ALGORITHMs

วันพฤหัสบดีที่ 19 พฤศจิกายน พ.ศ. 2552

การ swap ค่าระหว่างตัวแปร 2 ตัว

หลังจากที่ข้าพเจ้าได้ดองบล็อกนี้มาอย่างยาวนาน ( ด้วยสถานะ 0 บทความ ห้าห้าห้า) วันนี้เป็นฤกษ์งามยามดีที่จะสร้างบทความแรกกันซะที เอ้า!!! ลุย!!!

ก่อนอื่นเรามารู้จักคำว่า swap กันซะก่อน

ตามพจนานุกรมฉบับกูเกิ้ลบัณฑิตยสถาน ได้ให้ความหมายไว้ว่า เมื่อใช้ทำหน้าที่เป็นคำนาม หมายถึง กการแลกของ การแลกเปลี่ยน การผลัดเปลี่ยน หรือใช้ทำหน้าที่เป็นคำกริยา หมายถึง แลกของ แลกเปลี่ยน

ในทาง Computer Programming Algorithms คำว่า swap หมายถึง การแลกเปลี่ยนค่าระหว่างพื้นที่ตัวแปร 2 ตัว โดยผลสิ้นสุดของการแลกเปลี่ยนจะทำให้ตัวแปรแรกเก็บข้อมูลเดิมของตัวแปรที่สอง และตัวแปรที่สองเก็บข้อมูลเดิมของตัวแปรแรก

ดังตัวอย่าง

int a = 3;
int b = 5;
swap(&a,&b);

ภายในฟังก์ชัน swap จะทำให้
ตัวแปร a เป็น 5 และ
ตัวแปร b เป็น 3

ซึ่ง Algorithms ที่อยู่ภายในฟังก์ชัน swap นั้น สามารถเขียนได้มากมายหลายรูปแบบแล้วแต่ความอภิรมณ์ของโปรแกรมเมอร์ ว่าอยากจะเขียนให้งดงามมากแค่ไหน

วันนี้ ข้าพเจ้าจะนำเสนอ Swap Algorithms พื้นฐาน 3 แบบ

1. Swap Algorithms I : โดยอาศัยตัวแปร Temporary พักข้อมูล

void swap(int *a,int *b){
int temp;
temp = *a;
*a = *b;
*b = temp;
}

อธิบาย Source Code :

int temp; จองหน่วยความจำให้ตัวแปรชื่อ temp
( a = 3, b = 5, temp = ไม่ทราบค่าที่แน่นอน)

temp = *a; กำหนดให้ตัวแปร temp เก็บค่าที่อยู่ในตัวแปร a
( a = 3, b = 5, temp = 3 )

*a = *b; กำหนดให้ตัวแปร a เก็บค่าที่อยู่ในตัวแปร b
(a = 5, b = 5, temp = 3 )

*b = temp; กำหนดให้ตัวแปร b เก็บค่าที่อยู่ในตัวแปร temp
(a = 5, b = 3, temp = 3 )

ข้อดีของ Algolithms : เขียนง่าย เข้าใจง่าย อธิบายได้ง่าย
ข้อเสียของ Algorthms : เปลืองพื้นที่ในหน่วยความจำเพื่อจองตัวแปร temp

2. Swap Algorithms II : โดยการใช้ การบวกลบ

void swap(int *a,int *b){
*b = *a - *b;
*a -= *b;
*b += *a;
}

อธิบาย Source Code :

เริ่มต้น
(a = 3, b = 5)

*b = *a - *b; กำหนดให้ตัวแปร b เก็บค่า a-b
( a = 3, b = -2 )

*a -= *b; กำหนดให้ตัวแปร a เก็บค่า a-b
(a = 5, b = -2)

*b += *a; กำหนดให้ตัวแปร b เก็บค่า b+a
(a = 5, b = 3)

ข้อดีของ Algorithms : ไม่เปลืองหน่วยความจำ
ข้อเสียของ Algorithms : การดำเนินการทางคณิตศาสตร์ใช้เวลาในการประมวลผลมาก

3. Swap Algorithms III : โดยการใช้ xor operator

void swap(int *a,int *b){
if(*a != *b)
{
*b ^= *a;
*a ^= *b;
*b ^= *a;
}
}

อธิบาย Source Code :

เริ่มต้น
( a = 3, b = 5 เมื่อเขียนเป็นเลนฐาน 2 จะเป็น a = 0011, b = 0101)

*b ^= *a; กำหนดให้ตัวแปร b เก็บค่า b xor a
( a = 3, b = 6 เมื่อเขียนเป็นเลนฐาน 2 จะเป็น a = 0011, b = 0110)

*a ^= *b; กำหนดให้ตัวแปร a เก็บค่า a xor b
( a = 5, b = 6 เมื่อเขียนเป็นเลนฐาน 2 จะเป็น a = 0101, b = 0110)

*b ^= *a; กำหนดให้ตัวแปร b เก็บค่า b xor a
( a = 5, b = 3 เมื่อเขียนเป็นเลนฐาน 2 จะเป็น a = 0101, b = 0011)

แต่ถ้า a และ b มีค่าเท่ากันจะไม่ดำำเนินการ เพราะ จะได้ค่า 0

ข้อดีของ Algolithms : การทำงานระดับบิตใช้เวลาน้อย ไม่สิ้นเปลืองหน่วยความจำ
ข้อเสียของ Algorthms : อธิบายได้ยากหากไม่เข้าใจการทำงานระดับบิต

Swap Algorithms ทั้ง 3 แบบ ที่นำเสนอให้ชมกันไปนั้น เป็นเพียงตัวอย่างที่ใช้การโดยทั่วไป ซึ่งการเขียนโปรแกรมจริงๆนั้น โปรแกรมเมอร์อาจคิด Algorithms ที่สนุกกว่า หรืองดงามกว่า มาใช้ได้มากมายอย่างไร้ขีดจำกัด