การจัดเรียงข้อมูล

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

เมื่อแบ่งตามประเภทของข้อมูล การจัดเรียงข้อมูลนั้นจะมีอยู่ 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 การจัดเรียงข้อมูลแบบแมททริกซ์

ตรงนี้แหละครับที่คนชอบทำผิดกันเยอะ เพราะว่าไม่เข้าใจความหมายของคำสั่ง sort

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 จัดเรียงแมททริกซ์ได้ แต่หากเป็นข้อมูลของการทดลอง หรือการวิจัย หรือการเก็บสถิติใดๆ ส่วนมากแล้วข้อมูลแต่ละแถว แต่ละคอลัมภ์มันจะสัมพันธ์กัน ตัวอย่างเช่น


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 ดังนั้นจึงถูกย้ายสลับตำแหน่งกันนั่นเองครับ





จบหัวข้อการจัดเรียงข้อมูล

ความเห็น

โพสต์ยอดนิยมจากบล็อกนี้

การแก้สมการ Differential ด้วย MATLAB

การหาค่าเฉลี่ยโดยไม่ต้องเก็บค่า

ว่าด้วยเรื่องของ ERROR