“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:
sortnaik dan turun dengan'ascend'/'descend'sortdua keluaran[B, I]untuk melacak posisi aslisortrowsdengan kolom prioritas dan arah campuran- Perilaku stable sort pada nilai seri
Dataset yang dipakai di seluruh chapter ini (didefinisikan ulang agar chapter mandiri):
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.
fprintf('suhu naik : '); fprintf('%d ', sort(suhu)); fprintf('\n');
fprintf('suhu turun : '); fprintf('%d ', sort(suhu, 'descend')); fprintf('\n');Output yang Dihasilkan:
suhu naik : 29 30 30 31 31 32 32 33 34 35
suhu turun : 35 34 33 32 32 31 31 30 30 29Mari kita bedah baris-baris kode di atas:
- Baris 1 (
sort(suhu)): sepuluh pengukuran disusun dari 29 hingga 35;suhudi workspace tetap berurutan asli karenasortmenyalin hasilnya ke keluaran baru. - Baris 2 (
sort(suhu, 'descend')): arah dibalik dengan char'descend'— sama fungsinya dengansort(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:
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:
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 20Mari kita bedah baris-baris kode di atas:
- Baris 3 (
[unitUrut, idx] = sort(unit)):unitUrutberisi nilai terurut naik;idxpertama bernilai6karena unit terkecil (7) memang tinggal di baris ke-6. - Baris 5 (
hari(idx(1:5))): kolomharidiindeks denganidxsehingga ikut berbaris mengikuti urutan unit — hari 6, 3, 8, 1, 9 adalah lima hari paling lesu. - Baris 7-9 (
'descend'+ potongan 1:3): potongan1:3pada 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:
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:
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 17000Mari kita bedah baris-baris kode di atas:
- 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. - 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:
| Panggilan | Makna |
|---|---|
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:
fprintf('\nsortrows [3 2] (harga naik, unit naik):\n');
fprintf('%4d %5d %7d\n', sortrows(penjualan, [3 2]).');Output yang Dihasilkan:
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 17000Mari kita bedah hasil urutan tersebut:
- Kelompok pertama (harga 15000): lima baris dengan harga sama kini terurut menurut unit — 12, 15, 18, 19, 25 — persis kerja kolom kedua.
- 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.