การจัดเรียงข้อมูล
การจัดเรียงข้อมูลถึงแม้ดูเหมือนจะเป็นเรื่องง่ายๆ แต่ใครหลายๆ คนก็ยังเข้าใจผิด และใช้งานผิดๆ โดยไม่รู้ตัว ดังนั้นในหัวข้อนี้ เราจะมาทำความเข้าใจคำสั่งในการจัดเรียงข้อมูลกันนะครับ
เมื่อแบ่งตามประเภทของข้อมูล การจัดเรียงข้อมูลนั้นจะมีอยู่ 2 รูปแบบ ได้แก่ การจัดเรียงข้อมูลเวคเตอร์ หรือ อาเรย์ 1 มิติ และการจัดเรียงแมททริกซ์ หรือ อาเรย์ 2 มิติ ส่วนอาเรย์ 3 มิติ และมากกว่านั้น เวลาจัดเรียง ก็ต้องดึงข้อมูลออกมาทีละเลเยอร์ ซึ่งข้อมูลนั้นก็จะอยู่ในรูปของแมททริกซ์เช่นกัน
A = [1, 2, 5, 4, 3];
เวคเตอร์ที่มีขนาด 1xM (1 แถว M คอลัมภ์) จะเรียกว่า "Row vector"
หรือ
B = [1; 2; 5; 4; 3];
เวคเตอร์ที่มีขนาด Mx1 (M แถว 1 คอลัมภ์) จะเรียกว่า "Column vector"
ซึ่งข้อมูลประเภทเวคเตอร์ไม่ว่าจะเป็น Row vector หรือ Column vector สามารถจัดเรียงข้อมูลโดยใช้คำสั่ง sort ดังนี้
1. จัดเรียงข้อมูลจาก "น้อยไปมาก"
>> A = [1 2 5 4 3];
>> C = sort(A)
C =
1 2 3 4 5
2. จัดเรียงข้อมูลจาก "มากไปน้อย"
>> A = [1 2 5 4 3];
>> C = sort(A,'descend')
C =
5 4 3 2 1
3. จัดเรียงข้อมูลและเก็บตำแหน่งการสลับข้อมูลด้วย
>> A = [1 2 5 4 3];
>> [C,P] = sort(A)
C =
1 2 3 4 5
P =
1 2 5 4 3
ตัวแปร C คือข้อมูลที่จัดเรียงเรียบร้อยแล้ว ส่วนตัวแปร P คือตำแหน่งหลังการจัดเรียง ซึ่งมีวิธีการอ่านดังนี้
- ตำแหน่งที่ 1 ของ P มีค่าเท่ากับ 1 หมายความว่า
ข้อมูลในตำแหน่งที่ 1 ในตัวแปร C ย้ายมาจากตำแหน่งที่ 1 ในตัวแปร A
- ตำแหน่งที่ 2 ของ P มีค่าเท่ากับ 2 หมายความว่า
ข้อมูลในตำแหน่งที่ 2 ในตัวแปร C ย้ายมาจากตำแหน่งที่ 2 ในตัวแปร A
- ตำแหน่งที่ 3 ของ P มีค่าเท่ากับ 5 หมายความว่า
ข้อมูลในตำแหน่งที่ 3 ในตัวแปร C ย้ายมาจากตำแหน่งที่ 5 ในตัวแปร A
- ตำแหน่งที่ 4 ของ P มีค่าเท่ากับ 4 หมายความว่า
ข้อมูลในตำแหน่งที่ 4 ในตัวแปร C ย้ายมาจากตำแหน่งที่ 4 ในตัวแปร A
- ตำแหน่งที่ 5 ของ P มีค่าเท่ากับ 3 หมายความว่า
ข้อมูลในตำแหน่งที่ 5 ในตัวแปร C ย้ายมาจากตำแหน่งที่ 3 ในตัวแปร A
1. การจัดเรียงแมททริกซ์ด้วยคำสั่ง sort
เราสามารถใช้คำสั่ง sort จัดเรียงแมททริกซ์ ได้เช่นเดียวกันกับเวคเตอร์นะครับ เพียงแต่ว่าต้องเข้าใจว่า การใช้คำสั่ง sort จัดเรียงแมททริกซ์ คือ การจัดเรียงข้อมูลใหม่ทั้งหมด ตัวอย่างเช่น
>> A = [1 3 3; 4 5 2; 3 2 6]
A =
1 3 3
4 5 2
3 2 6
>> B = sort(A) %หากต้องการจัดเรียงจาก "มากไปน้อย" เขียนเป็น B = sort(A,'descend');
B =
1 2 2
3 3 3
4 5 6
จากผลลัพธ์นี้จะเห็นว่า ไม่ว่าจะเป็นข้อมูลในแนวแถว หรือ คอลัมภ์ ต่างถูกจัดเรียงใหม่ทั้งหมด ยกตัวอย่างเช่น ลองสังเกตุดูแถวที่ 2 ของ A นะครับ ข้อมูลในแถวนี้จะเป็น [4 5 2] แต่หลังจากจัดเรียงจะเห็นว่าเลข 4 ถูกย้ายลงไปไว้แถวที่ 3 แต่ข้อมูลกลับเป็น [4 5 6] ไม่ใช่ [4 5 2] เหมือนเดิมแล้วนะครับ นั่นก็เพราะว่า ข้อมูลในแต่ละคอลัมภ์ก็ถูกจัดเรียงด้วยเช่นกัน
ดังนั้นหากคุณต้องการผลลัพธ์แบบนี้ คุณสามารถใช้คำสั่ง sort จัดเรียงแมททริกซ์ได้ แต่หากเป็นข้อมูลของการทดลอง หรือการวิจัย หรือการเก็บสถิติใดๆ ส่วนมากแล้วข้อมูลแต่ละแถว แต่ละคอลัมภ์มันจะสัมพันธ์กัน ตัวอย่างเช่น
เมื่อเขียนเป็นแมททริกซ์จะได้
>> Student = [201 165 58;212 173 65;208 178 62]
Student =
201 165 58
212 173 65
208 178 62
เมื่อจัดเรียงด้วยคำสั่ง sort จะได้
>> NS = sort(Student)
NS =
201 165 58
208 173 62
212 178 65
เราจะเห็นว่าความหมายของข้อมูลนั้นผิดเพี้ยนไป เช่น นักเรียนรหัส 208 ปกติต้องมีความสูง 178 ซม. แต่หลังจัดเรียงเขากลับมีความสูงเพียง 173 ซม. เท่านั้น ซึ่งทำให้ข้อมูลชุดนี้เป็นข้อมูลที่ไม่ถูกต้องนั่นเอง ดังนั้นหากข้อมูลมีความสัมพันธ์กัน ห้ามใช้คำสั่ง sort จัดเรียงนะครับ
2. จัดเรียงแมททริกซ์ด้วยคำสั่ง sortrows
การจัดเรียงข้อมูลด้วยคำสั่ง sortrows นั้นจะจัดเรียงตามคอลัมภ์ที่เรากำหนดเอง เช่น
N1 = sortrows(Student,3) %จัดเรียงจาก "มากไปน้อย" เขียนเป็น N1 = sortrows(Student,3,'descend')
N1 =
201 165 58
208 178 62
212 173 65
จากตัวอย่างนี้คือการจัดเรียงข้อมูลโดยใช้คอลัมภ์ 3 เป็นหลัก ซึ่งจะเห็นว่าข้อมูลในคอลัมภ์ 3 ถูกเรียงลำดับจากน้อยไปมากเรียบร้อยแล้ว และข้อมูลในคอลัมภ์อื่นๆ ก็จะถูกย้ายตามคอลัมภ์ 3 ดังนั้นจะเห็นว่านักเรียนรหัส 208 ถูกย้ายขึนมาอยู่ลำดับที่ 2 (เพราะหนักเป็นอันดับ 2) แต่ก็ยังคงมีความสูง 178 ซม. เหมือนเดิม ดังนั้นถึงแม้จะจัดเรียงเรียง แต่ข้อมูลชุดนี้ก็ยังถูกต้องเหมือนเดิม
และถ้าเกิดว่าข้อมูลในคอลัมภ์นั้นมันซ้ำกัน เราก็สามารถใช้คอลัมภ์อื่น เป็นเงื่อนไขในการจัดเรียงเพิ่มเติมได้นะครับ ตัวอย่างเช่น
>> A = randi([1 9],4,4)
A =
4 6 7 6
9 1 7 2
8 8 7 7
9 9 4 1
ถ้าเราจัดเรียงโดยใช้คอลัมภ์ 3 อย่างเดียวก็จะได้ผลลัพธ์เป็น
>> B = sortrows(A,3)
B =
9 9 4 1
4 6 7 6
9 1 7 2
8 8 7 7
แต่ถ้าเราอยากกำหนดว่า ถ้าคอลัมภ์ที่ 3 มันมีค่าเท่ากัน ให้พิจารณาจัดเรียงจากคอลัมภ์ที่ 2 สามารถเขียนได้ดังนี้
C = sortrows(A,[3 2])
C =
9 9 4 1
9 1 7 2
4 6 7 6
8 8 7 7
จะเห็นว่าแถวที่ 3 ถูกย้ายขึ้นไปแทนที่แถวที่ 2 แล้วนะครับ เพราะว่าในคอลัมภ์ที่ 2 แถวที่ 3 มีค่าเท่ากับ 1 ซึ่งน้อยกว่าแถวที่ 2 ที่มีค่าเท่ากับ 6 ดังนั้นจึงถูกย้ายสลับตำแหน่งกันนั่นเองครับ
เมื่อแบ่งตามประเภทของข้อมูล การจัดเรียงข้อมูลนั้นจะมีอยู่ 2 รูปแบบ ได้แก่ การจัดเรียงข้อมูลเวคเตอร์ หรือ อาเรย์ 1 มิติ และการจัดเรียงแมททริกซ์ หรือ อาเรย์ 2 มิติ ส่วนอาเรย์ 3 มิติ และมากกว่านั้น เวลาจัดเรียง ก็ต้องดึงข้อมูลออกมาทีละเลเยอร์ ซึ่งข้อมูลนั้นก็จะอยู่ในรูปของแมททริกซ์เช่นกัน
แบบที่ 1 การจัดเรียงข้อมูลแบบเวคเตอร์
ข้อมูลแบบเวคเตอร์ ก็คือ อาเรย์ 1 มิติ เช่นA = [1, 2, 5, 4, 3];
เวคเตอร์ที่มีขนาด 1xM (1 แถว M คอลัมภ์) จะเรียกว่า "Row vector"
หรือ
B = [1; 2; 5; 4; 3];
เวคเตอร์ที่มีขนาด Mx1 (M แถว 1 คอลัมภ์) จะเรียกว่า "Column vector"
ซึ่งข้อมูลประเภทเวคเตอร์ไม่ว่าจะเป็น Row vector หรือ Column vector สามารถจัดเรียงข้อมูลโดยใช้คำสั่ง sort ดังนี้
1. จัดเรียงข้อมูลจาก "น้อยไปมาก"
>> A = [1 2 5 4 3];
>> C = sort(A)
C =
1 2 3 4 5
2. จัดเรียงข้อมูลจาก "มากไปน้อย"
>> A = [1 2 5 4 3];
>> C = sort(A,'descend')
C =
5 4 3 2 1
3. จัดเรียงข้อมูลและเก็บตำแหน่งการสลับข้อมูลด้วย
>> A = [1 2 5 4 3];
>> [C,P] = sort(A)
C =
1 2 3 4 5
P =
1 2 5 4 3
ตัวแปร C คือข้อมูลที่จัดเรียงเรียบร้อยแล้ว ส่วนตัวแปร P คือตำแหน่งหลังการจัดเรียง ซึ่งมีวิธีการอ่านดังนี้
- ตำแหน่งที่ 1 ของ P มีค่าเท่ากับ 1 หมายความว่า
ข้อมูลในตำแหน่งที่ 1 ในตัวแปร C ย้ายมาจากตำแหน่งที่ 1 ในตัวแปร A
- ตำแหน่งที่ 2 ของ P มีค่าเท่ากับ 2 หมายความว่า
ข้อมูลในตำแหน่งที่ 2 ในตัวแปร C ย้ายมาจากตำแหน่งที่ 2 ในตัวแปร A
- ตำแหน่งที่ 3 ของ P มีค่าเท่ากับ 5 หมายความว่า
ข้อมูลในตำแหน่งที่ 3 ในตัวแปร C ย้ายมาจากตำแหน่งที่ 5 ในตัวแปร A
- ตำแหน่งที่ 4 ของ P มีค่าเท่ากับ 4 หมายความว่า
ข้อมูลในตำแหน่งที่ 4 ในตัวแปร C ย้ายมาจากตำแหน่งที่ 4 ในตัวแปร A
- ตำแหน่งที่ 5 ของ P มีค่าเท่ากับ 3 หมายความว่า
ข้อมูลในตำแหน่งที่ 5 ในตัวแปร C ย้ายมาจากตำแหน่งที่ 3 ในตัวแปร A
แบบที่ 2 การจัดเรียงข้อมูลแบบแมททริกซ์
ตรงนี้แหละครับที่คนชอบทำผิดกันเยอะ เพราะว่าไม่เข้าใจความหมายของคำสั่ง sort1. การจัดเรียงแมททริกซ์ด้วยคำสั่ง sort
เราสามารถใช้คำสั่ง sort จัดเรียงแมททริกซ์ ได้เช่นเดียวกันกับเวคเตอร์นะครับ เพียงแต่ว่าต้องเข้าใจว่า การใช้คำสั่ง sort จัดเรียงแมททริกซ์ คือ การจัดเรียงข้อมูลใหม่ทั้งหมด ตัวอย่างเช่น
>> A = [1 3 3; 4 5 2; 3 2 6]
A =
1 3 3
4 5 2
3 2 6
>> B = sort(A) %หากต้องการจัดเรียงจาก "มากไปน้อย" เขียนเป็น B = sort(A,'descend');
B =
1 2 2
3 3 3
4 5 6
จากผลลัพธ์นี้จะเห็นว่า ไม่ว่าจะเป็นข้อมูลในแนวแถว หรือ คอลัมภ์ ต่างถูกจัดเรียงใหม่ทั้งหมด ยกตัวอย่างเช่น ลองสังเกตุดูแถวที่ 2 ของ A นะครับ ข้อมูลในแถวนี้จะเป็น [4 5 2] แต่หลังจากจัดเรียงจะเห็นว่าเลข 4 ถูกย้ายลงไปไว้แถวที่ 3 แต่ข้อมูลกลับเป็น [4 5 6] ไม่ใช่ [4 5 2] เหมือนเดิมแล้วนะครับ นั่นก็เพราะว่า ข้อมูลในแต่ละคอลัมภ์ก็ถูกจัดเรียงด้วยเช่นกัน
ดังนั้นหากคุณต้องการผลลัพธ์แบบนี้ คุณสามารถใช้คำสั่ง sort จัดเรียงแมททริกซ์ได้ แต่หากเป็นข้อมูลของการทดลอง หรือการวิจัย หรือการเก็บสถิติใดๆ ส่วนมากแล้วข้อมูลแต่ละแถว แต่ละคอลัมภ์มันจะสัมพันธ์กัน ตัวอย่างเช่น
STD ID | Hight(cm) | Weight(kg) |
---|---|---|
201 | 165 | 58 |
212 | 173 | 65 |
208 | 178 | 62 |
เมื่อเขียนเป็นแมททริกซ์จะได้
>> Student = [201 165 58;212 173 65;208 178 62]
Student =
201 165 58
212 173 65
208 178 62
เมื่อจัดเรียงด้วยคำสั่ง sort จะได้
>> NS = sort(Student)
NS =
201 165 58
208 173 62
212 178 65
เราจะเห็นว่าความหมายของข้อมูลนั้นผิดเพี้ยนไป เช่น นักเรียนรหัส 208 ปกติต้องมีความสูง 178 ซม. แต่หลังจัดเรียงเขากลับมีความสูงเพียง 173 ซม. เท่านั้น ซึ่งทำให้ข้อมูลชุดนี้เป็นข้อมูลที่ไม่ถูกต้องนั่นเอง ดังนั้นหากข้อมูลมีความสัมพันธ์กัน ห้ามใช้คำสั่ง sort จัดเรียงนะครับ
2. จัดเรียงแมททริกซ์ด้วยคำสั่ง sortrows
การจัดเรียงข้อมูลด้วยคำสั่ง sortrows นั้นจะจัดเรียงตามคอลัมภ์ที่เรากำหนดเอง เช่น
N1 = sortrows(Student,3) %จัดเรียงจาก "มากไปน้อย" เขียนเป็น N1 = sortrows(Student,3,'descend')
N1 =
201 165 58
208 178 62
212 173 65
จากตัวอย่างนี้คือการจัดเรียงข้อมูลโดยใช้คอลัมภ์ 3 เป็นหลัก ซึ่งจะเห็นว่าข้อมูลในคอลัมภ์ 3 ถูกเรียงลำดับจากน้อยไปมากเรียบร้อยแล้ว และข้อมูลในคอลัมภ์อื่นๆ ก็จะถูกย้ายตามคอลัมภ์ 3 ดังนั้นจะเห็นว่านักเรียนรหัส 208 ถูกย้ายขึนมาอยู่ลำดับที่ 2 (เพราะหนักเป็นอันดับ 2) แต่ก็ยังคงมีความสูง 178 ซม. เหมือนเดิม ดังนั้นถึงแม้จะจัดเรียงเรียง แต่ข้อมูลชุดนี้ก็ยังถูกต้องเหมือนเดิม
และถ้าเกิดว่าข้อมูลในคอลัมภ์นั้นมันซ้ำกัน เราก็สามารถใช้คอลัมภ์อื่น เป็นเงื่อนไขในการจัดเรียงเพิ่มเติมได้นะครับ ตัวอย่างเช่น
>> A = randi([1 9],4,4)
A =
4 6 7 6
9 1 7 2
8 8 7 7
9 9 4 1
ถ้าเราจัดเรียงโดยใช้คอลัมภ์ 3 อย่างเดียวก็จะได้ผลลัพธ์เป็น
>> B = sortrows(A,3)
B =
9 9 4 1
4 6 7 6
9 1 7 2
8 8 7 7
แต่ถ้าเราอยากกำหนดว่า ถ้าคอลัมภ์ที่ 3 มันมีค่าเท่ากัน ให้พิจารณาจัดเรียงจากคอลัมภ์ที่ 2 สามารถเขียนได้ดังนี้
C = sortrows(A,[3 2])
C =
9 9 4 1
9 1 7 2
4 6 7 6
8 8 7 7
จะเห็นว่าแถวที่ 3 ถูกย้ายขึ้นไปแทนที่แถวที่ 2 แล้วนะครับ เพราะว่าในคอลัมภ์ที่ 2 แถวที่ 3 มีค่าเท่ากับ 1 ซึ่งน้อยกว่าแถวที่ 2 ที่มีค่าเท่ากับ 6 ดังนั้นจึงถูกย้ายสลับตำแหน่งกันนั่นเองครับ
จบหัวข้อการจัดเรียงข้อมูล