2018-3-15 TIL JS Sorting
정렬
들어가기
- 컴퓨터에 무언가를 저장할때, 우리는 공간을 요청한다. 그러면 컴퓨터는 메모리를 할당을 해주고, 여러개의 원소를 저장하게되면 배열과 리스트라는 2가지 방법중 1가지를 선택해야한다.
배열과 연결리스트
- 메모리안에 저장된 데이터를 삽입/삭제 하는 경우가 많다. 이 경우 어떻게 해야되나?
- 배열을 사용하면 새 원소를 추가할때 모든 자리를 한칸씩 옮겨야 된다. 여분의 공간을 미리 만들어야하는데, 추가가 안되면 쓸때없는 메모리를 낭비하게된다.
- 하지만 연결리스트를 사용하면 원소를 메모리 어느곳에나 둘 수 있다.
- 모든 원소의 값을 한 번에 읽어야 한다면 연결 리스트가 좋지만, 특정한 원소만 탐색 하고 싶다면 연결리스트는 최악이다. 처음부터 끝까지 일일이 다 찾아야 된다. 하지만 배열은 모든 원소의 주소를 다 알고있기때문에 탐색에 최적화가 되어있다.
선택정렬
- 주어진 리스트 중에 최소값을 찾는다.
- 최솟값을 맨앞의 자리와 교환한다.
- 맨 처음위치를 뺀 나머지 리스트를 같은 방법으로 반복한다.
// 1-n까지 정수가 들어있는 배열
// length : 생성될 배열의 길이
// reuturn : 배열
// length 길이 만큼의 배열을 생성한다.
function genArray(length) {
var arr = [];
for (var i = 0; i <+ length; i++) {
arr[i] = i + 1;
}
return arr;
}
// knuth shuffle
function shuffle(arr) {
// 각각의 원소를 뒤섞는다
for(var i = arr.length - 1; i > 0; i--) {
var imax = i + 1;
var ridx = Math.floor(Math.random() * imax); // 0 ~ len-1
var temp = arr[i];
arr[i] = arr[ridx];
arr[ridx] = temp;
}
return arr;
}
function selectionSort(arr) {
for (var i = 0; i < arr.length - 1; i++) {
var idx = i;
var min = arr[i];
for (var j = i; j < arr.length; j++) {
if (arr[j] < min) {
idx = j;
min = arr[j];
}
}
// 바꿔주는 지점. i, min이랑 바꿔주는 지점.
var temp = arr[i];
arr[i] = arr[idx];
arr[idx] = temp;
}
return arr;
}
// 정렬이 됬는지 확인하는 과정
function checkSorted(arr) {
for (var i = 0; i < arr.length - 1; i++) {
if (arr[i] > arr[i+1]) {
return false;
}
}
return true;
}
//main(); unnamed function
(function() {
var testArray = genArray(20);
console.log(testArray);
console.log(shuffle(testArray));
console.log(selectionSort(testArray));
console.log(checkSorted(testArray));
})()
Written on March 15, 2018