Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

วิธีจัดเรียง Two-Dimensional Array ใน C#

ภาพรวม

การจัดเรียง Two-Dimensional Array (Rectangular Array) ใน C# ไม่มีเมธอด Built-in ตรงๆ ต้องเขียนอัลกอริทึมเอง วิธีทั่วไปคือจัดเรียง แต่ละแถว (Row) แยกกัน โดยใช้ Nested Loop และ Bubble Sort (หรืออัลกอริทึมอื่น)

หลักการจัดเรียงแถว (Row-wise Sort)

สำหรับแต่ละแถว ใช้ Bubble Sort:

for (int k = 0; k < j; k++)
{
    if (arr[i, k] > arr[i, k + 1])
    {
        int temp = arr[i, k];
        arr[i, k] = arr[i, k + 1];
        arr[i, k + 1] = temp;
    }
}

โค้ดเต็ม: จัดเรียงทุกแถวใน 2D Array

using System;

public class Demo
{
    public static void Sort2DArrayRows(int[,] arr)
    {
        int rows = arr.GetLength(0);
        int cols = arr.GetLength(1);
        
        for (int i = 0; i < rows; i++)
        {
            // Bubble Sort สำหรับแถวที่ i
            for (int j = cols - 1; j > 0; j--)
            {
                for (int k = 0; k < j; k++)
                {
                    if (arr[i, k] > arr[i, k + 1])
                    {
                        int temp = arr[i, k];
                        arr[i, k] = arr[i, k + 1];
                        arr[i, k + 1] = temp;
                    }
                }
            }
        }
    }
    
    public static void Print2DArray(int[,] arr)
    {
        int rows = arr.GetLength(0);
        int cols = arr.GetLength(1);
        
        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < cols; j++)
                Console.Write(arr[i, j] + "\t");
            Console.WriteLine();
        }
    }
    
    static void Main()
    {
        int[,] arr = { { 9, 2, 7 }, { 5, 1, 8 }, { 4, 6, 3 } };
        
        Console.WriteLine("ก่อนจัดเรียง:");
        Print2DArray(arr);
        
        Sort2DArrayRows(arr);
        
        Console.WriteLine("\nหลังจัดเรียงแต่ละแถว:");
        Print2DArray(arr);
    }
}

ผลลัพธ์

ก่อนจัดเรียง:
9       2       7
5       1       8
4       6       3

หลังจัดเรียงแต่ละแถว:
2       7       9
1       5       8
3       4       6

การจัดเรียงแบบอื่นๆ

1. จัดเรียงตามคอลัมน์ (Column-wise)

for (int j = 0; j < cols; j++)
{
    for (int i = rows - 1; i > 0; i--)
    {
        for (int k = 0; k < i; k++)
        {
            if (arr[k, j] > arr[k + 1, j])
            {
                int temp = arr[k, j];
                arr[k, j] = arr[k + 1, j];
                arr[k + 1, j] = temp;
            }
        }
    }
}

2. จัดเรียงทั้งอาร์เรย์เป็น 1 มิติ (Flatten & Sort)

// แปลงเป็น 1D, เรียง, แปลงกลับ
int[] flat = new int[rows * cols];
int idx = 0;
for (int i = 0; i < rows; i++)
    for (int j = 0; j < cols; j++)
        flat[idx++] = arr[i, j];

Array.Sort(flat);

idx = 0;
for (int i = 0; i < rows; i++)
    for (int j = 0; j < cols; j++)
        arr[i, j] = flat[idx++];

3. ใช้ LINQ (สั้นแต่ช้ากว่า)

using System.Linq;

var sortedRows = arr.Cast()
    .Select((v, i) => new { Row = i / cols, Col = i % cols, Val = v })
    .GroupBy(x => x.Row)
    .Select(g => g.OrderBy(x => x.Val).Select(x => x.Val).ToArray())
    .ToArray();

// คัดลอกกลับ (ต้องรู้ขนาด cols)
for (int i = 0; i < rows; i++)
    for (int j = 0; j < cols; j++)
        arr[i, j] = sortedRows[i][j];

ข้อสังเกตสำคัญ

  • 2D Array ใน C# จัดเก็บแบบ Row-Major (ต่อเนื่องในหน่วยความจำ) → Row-wise Sort เร็วที่สุด
  • ใช้ GetLength(0) สำหรับแถว, GetLength(1) สำหรับคอลัมน์
  • Bubble Sort ใช้เพื่อการศึกษา - จริงควรใช้ Array.Sort บนอาร์เรย์ 1D ที่ Flatten แล้ว
  • Jagged Array ([][]) จัดเรียงง่ายกว่า: Array.Sort(jagged[i]) ต่อแถวได้เลย