일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 이종호
- 자바스크립트
- react
- jest
- data structure
- 호키도키
- Hitit
- TDD
- 자스민
- 호키스
- queue
- 리액트
- SWIFT
- 개발자
- Svelte
- 자료구조
- HTML
- 계명대 이종호
- 스위프트
- 스벨트
- IOS
- 자바스크립트 자료구조
- 개발
- hokidoki
- 비동기
- hokeys
- 힛잇
- 리액트 예제
- javascript
- 계명대
Archives
- Today
- Total
Dog foot print
[javascript]quick-sort - ver2 (median, left, right)pivot 본문
( 너무나도 꼰대적인 교수 한명 때문에 이번 학기는 정말이지 너무나도 스트레스 받는다. )
파라메터로 넘겨주는 값에 따라 pivot의 위치가 변하는 퀵소트
function swap(list, from, to) {
const dummy = list[to];
list[to] = list[from];
list[from] = dummy;
}
function findMedian(list, left, mid, right) {
let median = right;
if (list[left] > list[mid] && list[mid] < list[right]) {
median = mid;
} else if (list[mid] > list[right] && list[right] < list[left]) {
median = right;
} else if (list[mid] > list[left] && list[left] < list[right]) {
median = left;
}
return median;
}
function partition(list, left, right, mode) {
let row = left;
let high = right;
let mid = Math.floor((left + right) / 2);
console.log(mid)
let pivot;
let pivot_value;
if (mode === "m") {
pivot = findMedian(list, left, mid, right);
pivot_value = list[pivot];
} else if (mode === "l") {
pivot = left;
pivot_value = list[pivot];
} else {
pivot = right;
pivot_value = list[pivot];
}
while (row < high) {
if(pivot === left || pivot === right){
while (list[row] <= pivot_value && row < high)
row++;
while (list[high] >= pivot_value && high >= row)
high--;
}else if(pivot === mid){
while (list[row] <= pivot_value && row <= high)
row++;
while (list[high] > pivot_value && high >= row)
high--;
}
if (row >= high)
break;
swap(list, row, high);
}
if (pivot === left) {
swap(list, pivot, high);
return high;
} else if (pivot === right) {
swap(list, pivot, high + 1);
return high;
}else if(pivot === mid){
return high;
}
}
function quickSort(list, left, right, mode) {
if (left < right) {
const pivot = partition(list, left, right, mode);
console.log(left, right)
// console.log(pivot)
quickSort(list, left, pivot, mode);
quickSort(list, pivot + 1, right, mode);
}
}
//option
//'l' == leftPivot
//'r' == rightPivot
//'m' == median
const array = [30, 1,4, 1,10,56, 2, 30,102,804, 4,20, 20,172,26,390, 7,12 ,10,2];
quickSort(array,0,array.length-1,'m');
console.log(array);
quickSort 함수의 4번째로 넣어주는 char에 따라 pivot의 위치가 배열의 왼쪽 , 중간 값, 오른쪽으로 변한다. 왼쪽과 오른쪽을 피벗으로 설정하여 , 퀵소트를 실행하는 것은 간단하나, 중간 값을 이 퀵소트를 최대한 변화시키지 않고, 활용하기는 조금 힘들었다. 중간 값 피벗은 배열의 맨 왼쪽과 맨 오른쪽, 중간에 위치한 값 중 값이 2번째로 높은 것을 피벗으로 설정하는데, 좌측 일수도 , 중간 일수도 , 우측 일수도 있기에 이때 설정된 피벗의 위치에따라 swap의 조건이 달라진다.
반응형
'Javascript' 카테고리의 다른 글
[javascript] 클로저와 스코프 정리 (0) | 2020.01.11 |
---|---|
[javascript] 선택정렬 (0) | 2019.12.27 |
[javascript] 우선순위 큐, heap (2) (0) | 2019.08.09 |
[javascript] 우선순위 큐 (1) (0) | 2019.08.08 |
[javascript] tree , 삽입과 삭제 (3) (0) | 2019.08.06 |
Comments