ภาพรวม
การจัดเรียง 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])ต่อแถวได้เลย