일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- view 이동
- External Call
- .dsym
- reentrancy
- ethereum
- 분산원장
- 블록체인
- 프로그래머스
- PBFT
- 블록체인 기술
- DEFI
- 재진입공격
- 이더리움
- pow
- Mining
- dsYM
- Crash
- Blockchain
- 비트코인
- ios
- Algorithm
- viewcontroller
- Report
- POS
- solidity
- DPOS
- 알고리즘
- 백준
- 암호화폐
- Xcode
Archives
- Today
- Total
개발하기좋은날
QuickSort 본문
반응형
퀵 정렬은 합병정렬과 비슷하게 분할정복(Divide and Conquer) 알고리즘이다. 평균적으로 매우 빠른 수행 속도를 자랑하는 정렬 방법으로 다음과 같은 과정을 거친다
1. 리스트 안에 있는 한 요소를 선택한다. 이렇게 고른 원소를 pivot(피벗) 이라고 한다.
2. pivot을 기준으로 pivot보다 작은 요소들은 모두 pivot의 왼쪽으로 옮기고 pivot보다 큰 요소들은 모두 pivot의 오른쪽으로 옮긴다.
3. pivot을 제외한 왼쪽 리스트와 오른쪽 리스트를 다시 정렬한다.
3-1) 분할된 왼쪽 리스트와 오른쪽 리스트도 다시 pivot을 정하고 pivot을 기준으로 2개의 부분리스트로 나눈다.
3-2) 재귀를 사용하여 부분 리스트들이 더이상 분할이 불가능 할 때까지 반복한다.
풀이는 아래와 같다
const quickSort = function (arr) {
return solution(arr,0,(arr.length-1),0);
};
function solution(arr,L,R,index)
{
let pivot = Math.floor((R+L)/2);
let left = L;
let right = R;
// 사이클 정렬
while(true)
{
//left pivot 보다 큰수를 만나거나, pivot을 만나면 stop
while(true)
{
if((arr[pivot] < arr[left]) || (left == pivot))
break;
else
left++;
}
//right가 pivot보다 작은수를 만나거나 pivot을 만나면 stop
while(true)
{
if(arr[right] < arr[pivot] || (right == pivot))
break;
else
right--;
}
// 이후 left가 right보다 왼쪽에 있으면 교환
if(left < right)
{
let temp = arr[right];
arr[right] = arr[left];
arr[left] = temp;
if(left != pivot)
left ++;
right --;
}else
{
if((arr[left] < arr[R]) && (2 <= (R-left))) // 오른쪽 정렬
solution(arr,left,R,index)
if(arr[L] < arr[right]) // 왼쪽 정렬
solution(arr,L,right,index)
return arr;
}
}
}
반응형
'Algorithm' 카테고리의 다른 글
BFS(Breadth-First Search) 알고리즘 (0) | 2022.07.05 |
---|---|
BFS를 이용한 primPassword 찾기 (0) | 2022.07.05 |
binarySearch (0) | 2022.06.07 |
largestProductOfThree (0) | 2022.06.02 |
treeDFS (0) | 2022.06.02 |
Comments