ก่อนอื่นเรามารู้จักคำว่า 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;
}
*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)
อธิบาย 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 ที่สนุกกว่า หรืองดงามกว่า มาใช้ได้มากมายอย่างไร้ขีดจำกัด
ข้อดีของ Algolithms : การทำงานระดับบิตใช้เวลาน้อย ไม่สิ้นเปลืองหน่วยความจำ
ข้อเสียของ Algorthms : อธิบายได้ยากหากไม่เข้าใจการทำงานระดับบิต
Swap Algorithms ทั้ง 3 แบบ ที่นำเสนอให้ชมกันไปนั้น เป็นเพียงตัวอย่างที่ใช้การโดยทั่วไป ซึ่งการเขียนโปรแกรมจริงๆนั้น โปรแกรมเมอร์อาจคิด Algorithms ที่สนุกกว่า หรืองดงามกว่า มาใช้ได้มากมายอย่างไร้ขีดจำกัด