누구나 자료 구조와 알고리즘

roadzmoon76·2022년 2월 18일
0

알고리즘

목록 보기
5/6

정렬 알고리즘

버블 정렬

내 풀이

function bubble (arr) {
  let temporaryValue;

  for (let i = 1; i < arr.length; i++) {
    for (let j = 0; j < arr.length - 1; j++) {
      if (arr[j] > arr[j+1]) {
        temporaryValue = arr[j];
        arr[j] = arr[j+1];
        arr[j+1] = temporaryValue;
      }
    }
  }
  
  return arr;
}

책 풀이

function bubble (arr) {
  let unsortedIndex = arr.length - 1;
  let sorted = false;
  let temporary;

  while (!sorted) {
    sorted = true;
    for (let i = 0; i < unsortedIndex; i++) {
      if (arr[i] > arr[i+1]) {
        temporary = arr[i];
        arr[i] = arr[i+1];
        arr[i+1] = temporary;
        sorted = false;
      }
    }
    unsortedIndex -= 1; 
  }

  return arr;
}
  • 책에선 어떤 교환도 하지 않은 패스스루였을땐 배열이 완전히 정렬된걸로 보고 문제가 해결된걸로 판단하게 코드를 짜라고 했는데, 내 코드는 그런 논리구조가 없어 정렬이 완료 됐는데도 패스스루를 반복하는 코드가 됨.

선택 정렬

내 풀이

function select (arr) {
  let smallestIndex;
  let temporaryValue;
  for (let i = 0; i < arr.length - 1; i++) {
    smallestIndex = i;
    for (let j = i + 1; j < arr.length; j++) {
      if (arr[smallestIndex] > arr[j]) {
        smallestIndex = j;
      }
    }
    if (smallestIndex !== i) {
      temporaryValue = arr[i];
      arr[i] = arr[smallestIndex];
      arr[smallestIndex] = temporaryValue;
    }
  }
  return arr;
}

책 풀이

function selectionSort(array) {
  for(let i = 0; i < array.length - 1; i++) {
    let lowestNumberIndex = i;
    for(let j = i + 1; j < array.length; j++) {
      if(array[j] < array[lowestNumberIndex]) {
        lowestNumberIndex = j;
      }
    }

    if(lowestNumberIndex != i) {
      let temp = array[i];
      array[i] = array[lowestNumberIndex];
      array[lowestNumberIndex] = temp;
    }
  }
  return array;
}
  • 내 풀이와 거의 동일하나 lowestNumberIndex 변수와 temp 변수 선언을 해당 변수가 필요한 코드블럭 스코프에서 선언함. 자바스크립트 엔진이 필요한 변수를 찾으러 함수 스코프까지 검색을 할 필요가 없으므로 속도면에서 조금이라도 더 유리한 코드라 생각.
  • 생각해보니 위와같이 하면 for 문을 돌때마다 변수를 계속 선언하게 되는데 for문에서 한번 선언된 변수는 실행컨텍스트에 올라가 있어 매 반복마다 선언이 되는게 아닌건지 찾아봐야겠다.

삽입 정렬

내 풀이

function insertion (arr) {
  for (let i = 1; i < arr.length; i++) {
    let tempValue = arr[i];
    for (let j = i - 1; j >= 0; j--) {
      if (arr[j] < tempValue) {
        arr[j+1] = tempValue;
        break;
      }
      arr[j+1] = arr[j];
      if (j === 0) {
        arr[j] = tempValue;
      }
    }
  }
  return arr;
}

책 풀이

profile
크론병걸린 자퇴생, 개발자되기

0개의 댓글