“Lima hari penjualan terbaik”, “suhu tertinggi berurutan”, “pelanggan dengan transaksi terbesar” — hampir semua laporan menuntut data dalam keadaan terurut. Pengurutan (sorting) juga bahan baku analisis lain: median dihitung dari data terurut, dan peringkat lahir dari urutan. MATLAB menyediakan sort untuk vektor serta sortrows untuk matriks dataset, dan keduanya punya perilaku yang perlu kita pahami sebelum dipakai. Cakupan chapter ini:

  • sort naik dan turun dengan 'ascend'/'descend'
  • sort dua keluaran [B, I] untuk melacak posisi asli
  • sortrows dengan kolom prioritas dan arah campuran
  • Perilaku stable sort pada nilai seri

Dataset yang dipakai di seluruh chapter ini (didefinisikan ulang agar chapter mandiri):

matlab
penjualan = [1 12 15000; 2 15 15000; 3 9 16000; 4 22 16000; 5 18 15000;
             6 7 17000; 7 25 15000; 8 11 16000; 9 14 17000; 10 20 16000;
             11 16 17000; 12 19 15000];   % kolom: hari, unit, harga
suhu = [30 32 31 29 33 34 31 30 35 32];  % suhu harian (derajat)

sort: Naik dan Turun #

Aturannya: sort(v) mengurutkan elemen vektor menaik (default 'ascend'), dan sort(v, 'descend') mengurutkannya menurun. Mekanismenya: sort mengembalikan array BARU — vektor asli tidak tersentuh — dengan elemen disusun ulang mengikuti arah yang diminta. Khusus NaN: secara default NaN ditempatkan paling akhir untuk urutan naik dan paling awal untuk urutan turun (perilaku 'MissingPlacement', 'auto'); name-value 'MissingPlacement' ('first'/'last') mengatur posisinya secara eksplisit.

matlab
fprintf('suhu naik  : '); fprintf('%d ', sort(suhu)); fprintf('\n');
fprintf('suhu turun : '); fprintf('%d ', sort(suhu, 'descend')); fprintf('\n');

Output yang Dihasilkan:

text
suhu naik  : 29 30 30 31 31 32 32 33 34 35
suhu turun : 35 34 33 32 32 31 31 30 30 29

Mari kita bedah baris-baris kode di atas:

  1. Baris 1 (sort(suhu)): sepuluh pengukuran disusun dari 29 hingga 35; suhu di workspace tetap berurutan asli karena sort menyalin hasilnya ke keluaran baru.
  2. Baris 2 (sort(suhu, 'descend')): arah dibalik dengan char 'descend' — sama fungsinya dengan sort(suhu, 'ascend') yang eksplisit.

Indeks Asli: [B, I] = sort(A) #

Masalah nyatanya: mengurutkan nilai saja membuang jawaban “kapan kejadian itu terjadi?” — lima unit terkecil tidak memberi tahu hari mana yang lesu. Mekanismenya: bentuk dua keluaran [B, I] = sort(v) mengembalikan nilai terurut B DAN vektor indeks I; elemen ke-k dari I mencatat posisi ASAL nilai ke-k di vektor lama. Indeks ini menjadi “gagang” untuk menyeret kolom lain mengikuti urutan — pola yang setara dengan JOIN di database:

matlab
unit = penjualan(:, 2);
hari = penjualan(:, 1);
[unitUrut, idx] = sort(unit);
fprintf('5 unit terkecil : '); fprintf('%d ', unitUrut(1:5)); fprintf('\n');
fprintf('terjadi di hari : '); fprintf('%d ', hari(idx(1:5))); fprintf('\n');

[unitTurun, idxTurun] = sort(unit, 'descend');
fprintf('3 hari teratas  : %d %d %d\n', hari(idxTurun(1:3)));
fprintf('unitnya         : %d %d %d\n', unitTurun(1:3));

Output yang Dihasilkan:

text
5 unit terkecil : 7 9 11 12 14
terjadi di hari : 6 3 8 1 9
3 hari teratas  : 7 4 10
unitnya         : 25 22 20

Mari kita bedah baris-baris kode di atas:

  1. Baris 3 ([unitUrut, idx] = sort(unit)): unitUrut berisi nilai terurut naik; idx pertama bernilai 6 karena unit terkecil (7) memang tinggal di baris ke-6.
  2. Baris 5 (hari(idx(1:5))): kolom hari diindeks dengan idx sehingga ikut berbaris mengikuti urutan unit — hari 6, 3, 8, 1, 9 adalah lima hari paling lesu.
  3. Baris 7-9 ('descend' + potongan 1:3): potongan 1:3 pada hasil terurut menurun menghasilkan papan peringkat — tiga hari terbaik adalah hari 7, 4, dan 10.

sortrows: Matriks Bergerak Satu Baris Utuh #

sort pada matriks mengurutkan tiap KOLOM secara terpisah — kolom-kolom tidak lagi sejajar dengan observasi aslinya. Untuk dataset, aturannya: sortrows(M, k) mengurutkan baris-baris M menurut kolom ke-k, dan satu baris observasi berpindah UTUH (hari, unit, harga ikut bersama). Mekanismenya: sortrows membandingkan nilai kolom kunci antar baris, lalu menukar posisi baris secara menyeluruh; kolom negatif -k berarti urut menurun menurut kolom k tersebut:

matlab
fprintf('\nsortrows kolom 2 (naik):\n');
fprintf('%4d %5d %7d\n', sortrows(penjualan, 2).');

fprintf('\nsortrows kolom -2 (turun):\n');
fprintf('%4d %5d %7d\n', sortrows(penjualan, -2).');

Output yang Dihasilkan:

text

sortrows kolom 2 (naik):
   6     7   17000
   3     9   16000
   8    11   16000
   1    12   15000
   9    14   17000
   2    15   15000
  11    16   17000
   5    18   15000
  12    19   15000
  10    20   16000
   4    22   16000
   7    25   15000

sortrows kolom -2 (turun):
   7    25   15000
   4    22   16000
  10    20   16000
  12    19   15000
   5    18   15000
  11    16   17000
   2    15   15000
   9    14   17000
   1    12   15000
   8    11   16000
   3     9   16000
   6     7   17000

Mari kita bedah baris-baris kode di atas:

  1. Baris 2 (sortrows(penjualan, 2)): baris hari 6 naik ke puncak karena unitnya paling kecil (7); kolom hari dan harga ikut pindah bersama kolom kunci.
  2. Baris 5 (sortrows(penjualan, -2)): tanda negatif membalik arah — papan peringkat unit terbesar; hasilnya persis kebalikan blok sebelumnya.

Ringkasan pola pengurutan yang perlu kita hafal:

PanggilanMakna
sort(v)vektor naik
sort(v, 'descend')vektor turun
[B, I] = sort(v)nilai terurut + posisi asal tiap nilai
sortrows(M, k)baris menurut kolom k, naik
sortrows(M, -k)baris menurut kolom k, turun
sortrows(M, [a b])prioritas: kolom a, seri dipecah kolom b
sortrows(M, [a -b])kolom a naik, kolom b turun

Prioritas Kolom dan Sort Stabil #

Banyak laporan butuh kunci majemuk: kelompokkan menurut harga, lalu di dalam tiap kelompok urutkan menurut unit. Mekanismenya: sortrows(M, [a b]) membandingkan kolom a lebih dulu; baris yang SERI di kolom a dipecah urutannya dengan kolom b — tanda negatif tetap berlaku per kolom:

matlab
fprintf('\nsortrows [3 2] (harga naik, unit naik):\n');
fprintf('%4d %5d %7d\n', sortrows(penjualan, [3 2]).');

Output yang Dihasilkan:

text

sortrows [3 2] (harga naik, unit naik):
   1    12   15000
   2    15   15000
   5    18   15000
  12    19   15000
   7    25   15000
   3     9   16000
   8    11   16000
  10    20   16000
   4    22   16000
   6     7   17000
   9    14   17000
  11    16   17000

Mari kita bedah hasil urutan tersebut:

  1. Kelompok pertama (harga 15000): lima baris dengan harga sama kini terurut menurut unit — 12, 15, 18, 19, 25 — persis kerja kolom kedua.
  2. Kelompok 16000 dan 17000: pola yang sama berulang; kunci kedua hanya bekerja pada baris yang seri di kunci pertama.

Bagaimana jika kunci kedua TIDAK dituliskan? sort dan sortrows MATLAB menggunakan algoritma stable: baris yang seri pada kolom kunci mempertahankan urutan relatif aslinya. sortrows(penjualan, 3) menempatkan kelima baris harga 15000 dengan urutan hari 1, 2, 5, 7, 12 — urutan kemunculannya di dataset, bukan urutan unit. Berkas contoh.m membuktikan perilaku ini pada blok terakhirnya.

Berkas contoh.m pada bagian bawah halaman menjalankan keenam pola di atas pada dataset penjualan dan suhu dalam satu script utuh.

Ringkasan #

sort mengurutkan vektor naik atau turun dan mengembalikan array baru; bentuk [B, I] = sort(v) membawa indeks asal untuk menyeret kolom lain ikut berurutan. sortrows menggerakkan baris observasi secara utuh menurut kolom kunci — satu angka, daftar prioritas, dan tanda negatif untuk arah turun. Nilai seri dipertahankan urutan aslinya (stable), namun kunci sekunder sebaiknya selalu dituliskan eksplisit. Data yang sudah terurut memudahkan pencarian — chapter berikutnya membahas find, ismember, dan kawan-kawannya.