sort? ์ ๋ ฌ ๋ฉ์๋ ์๋๊ฐ?๐ค
- ๋ผ๊ณ ์๊ฐํ๋ค๊ฐ ์ฝ๋ฉํ ์คํธ ๋ฌธ์ ํ๋ค๊ฐ ๋จธ๋ฆฟ์์ ๋ฌผ์ํ๋ก ๊ฐ๋์ฐผ๋ค. ์๊ฐ๋ณด๋ค sort๋ ๋ณต์กํ ํจ์์๊ณ ์ค๋ฆ์ฐจ์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ ๋ฒ๋ง ์์๋๋ฐ ์์ง ์์ญ๋ฌ์ญํ์ง๋ง ๊ทธ๋๋ ๊ธฐ์กด๋ณด๋ค๋ ๋ง์ด ์๊ฒ๋๋ค!
- sort๋ compareFunction ๋ผ๋ ์ฝ๋ฐฑํจ์๋ฅผ ์ธ์๋ก ๋ฐ์ ์ ์๋๋ฐ ์ด๋ ๋ฒ์น์ด ์๋ค.
- sort๋ ๋น๊ตํ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก a์ b ๋ฅผ ๋น๊ตํ๋ฉด a์ ์ ๋์ฝ๋(U+0061), b์ ์ ๋์ฝ๋(U+0062) ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋น๊ตํ๊ฒ ๋๋ค. ์ฆ a - b ๋ฅผ ํ๊ฒ๋๋ค๋ฉด ์์๊ฐ ๋์ค๊ฒ ๋๊ณ b๋ a ๋ณด๋ค ํฐ ์์๋ก ํ์ธ๋๋ค.
compareFunction
- ๋๋ ์์ MDN์ ์ ํ์๋ ๋ด์ฉ์ด ์ดํด๊ฐ ์๊ฐ๋ค. (ํน์ ์ฝ๊ฒ ์ค๋ช ๊ฐ๋ฅํ์ ๋ถ ๋๊ธ๋ถํ๋๋ฆฝ๋๋ค.)
- compareFunction์ ๋ฃ์ด์ฃผ๋ฉด compareFunction์๊ฒ ๋ฐฐ์ด์ ์์๋ฅผ 2๊ฐ์ฉ ๋ฐ๋ณตํด์ ๋ณด๋ด๊ณ compareFunction์ด ๋ฐํํ๋ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ์ ํ๋๋ฐ ๋ฐํ๊ฐ์ 0, ์์, ์์ 3๊ฐ์ง๋ก ๋๋์ด์ ธ์๋ค.
- compareFunction์ ๋ฐฐ์ด์ ํํ๋ ์ด๋ฌํ๋ค.
const num = [5, 10, 8, 2, 3];
num.sort((a, b) => {
return a - b;
});
console.log(num); // [ 2, 3, 5, 8, 10 ]
- return ๊ฐ์ด 0 ๋ณด๋ค ํฌ๋ฉด : b๊ฐ a ๋ณด๋ค ์์ ์์ด์ผ ํ๋ค. ( ๋ฆฌํด๊ฐ > 0 ) ์์
- return ๊ฐ์ด 0 ๋ณด๋ค ์์ผ๋ฉด : a ๊ฐ b ๋ณด๋ค ์์ ์์ด์ผ ํ๋ค. ( ๋ฆฌํด๊ฐ < 0 ) ์์
- return ๊ฐ์ด 0์ด๋ผ๋ฉด : a์ b์ ์์๋ฅผ ๋ณ๊ฒฝํ์ง ์๋๋ค.
์ซ์์ ์ค๋ฆ์ฐจ์ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
const num = [5, 4, 3, 2, 1];
num.sort((a, b) => {
console.log("num a =" + a); // 4, 3, 2, 1
console.log("num b =" + b); // 5, 4, 3, 2
return a - b;
});
console.log(num); // [1,2,3,4,5]
const num2 = [1, 2, 3, 4, 5];
num2.sort((a, b) => {
console.log("num2 a =" + a); // 2, 3, 4, 5
console.log("num2 b =" + b); // 1, 2, 3, 4
return b - a;
});
console.log(num2); // [5,4,3,2,1]
- ์ด๋ ๊ฒ ์งํํ๋ค. ์ฌ๊ธฐ์ ์ฃผ์ด์ง ์ธ์ a์ b ๋ ๋ญ๊น? ๋จ์ํ๊ฒ ์ฝ์๋ก๊ทธ๋ก ์ฐ์ด๋ดค์๋ ํ์นธ์ฉ ์ฎ๊ฒจ๊ฐ๋ฉฐ ๋ฐฐ์ด์์ ์์๋ฅผ ์ฐ์ด ๋ด๋๊ฑธ๋ก ๋ณด์ธ๋ค.
- num์ ์ฐ์ด๋ณธ ์ฝ์๋ก๊ทธ๋ฅผ ๋๋นํด ๋งํ์๋ฉด a - b == 4 - 5 ์ธ ์ ์ด๊ณ -1(์์)๋ฅผ ๋ฐํํ๋ฏ๋ก a๋ b๋ณด๋ค ์์์์ด์ผ ํ๋ ๋ ์์์ ์์น๋ฅผ ๋ณ๊ฒฝํ๊ฒ ๋๋ค.
- num2์ ๋ด๋ฆผ์ฐจ์์ ๋ณด๋ฉด b - a == 1 - 2 ๊ฐ ๋๊ณ ์ด ๋ํ ์์๋ฅผ ๋ฐํํ๋ฏ๋ก ์์์ ์์น๋ฅผ ๋ณ๊ฒฝํ๋ ์์ ์ด ๋ฐ๋ณต๋์ด ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๊ฒ ๋๋ค.
- ์ด๋ฐ ํ์์ ์ซ์์๋ง ํด๋น๋๋ฉฐ ๋ฌธ์์ด์ผ ๊ฒฝ์ฐ ๋ณดํต ์กฐ๊ฑด๋ถ ์ ๋ ฌ๋ก ํ๊ฒ๋๋ค. ๋ฌธ์์ด์ ์ ๋ ฌํ๊ณ ์ถ๋ค๋ฉด ์๋์ ์ค๋ช ์ ์ฐธ๊ณ ํ์.
์์ฉ ( Object์ ๋ ฌ, ์กฐ๊ฑด๋ถ ์ ๋ ฌ)
const student = [
{ name: "ํ๊ธธ๋", score: "60" },
{ name: "๊น์ฒ ์", score: "30" },
{ name: "์ฅ์ฒธ", score: "70" },
{ name: "๋ง๋์", score: "90" },
];
student.sort((a, b) => {
return a.score - b.score;
});
console.log(student);
// { name: "๊น์ฒ ์", score: "30" },
// { name: "ํ๊ธธ๋", score: "60" },
// { name: "์ฅ์ฒธ", score: "70" },
// { name: "๋ง๋์", score: "90" },
- ๊ฐ์ฒด ๋ฐฐ์ด์ key ๊ฐ์ ์ด์ฉํด ์ค๋ฆ์ฐจ์ ๋ด๋ฆผ์ฐจ์ ๋์ผํ๊ฒ ์ ๋ฆฌํ ์ ์๋ค.
- ์กฐ๊ฑด๋ถ ์ ๋ ฌ์ ์ฝ๋ฉํ ์คํธ ์ฐ์ตํ๋ฉฐ ๋ง๋ ์ด ํ์ด์ง๋ฅผ ์ฐธ๊ณ ํ์
Point .
- ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ sort๋ฉ์๋๋ฅผ ์ ๋ ฌํ ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก Tim sort๋ฅผ ์ฌ์ฉํ๋ค.
- TimSort๋ 'Insertion Sort'๊ณผ 'Merge Sort'๋ฅผ ๊ฒฐํฉํ์ฌ ๋ง๋ ์ ๋ ฌ์ด๋ผ๊ณ ํ๋ค. TimSort๋ ์๊ฐ๋ณต์ก๋ O(n\log n)์ ๊ฐ์ง๋ค.
'JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ค์ฝํ(Scope) (0) | 2022.08.28 |
---|---|
์ค๋ณต์์ ์ ๊ฑฐ๋ฐฉ๋ฒ์ ์์๋ณด์ (0) | 2022.08.26 |
toString์ ์์๋ณด์ (0) | 2022.08.20 |
๋ฌธ์์ด์ ์๋ผ๋ณด์ โ (substr, substring, slice) (0) | 2022.08.19 |
for, for...of, for...in (0) | 2022.08.19 |