전단 에서 파악 해 야 할 몇 가지 정렬 알고리즘
간단 한 소개 및 실현
아래 의 순 서 는 모두 오름차 순 이다.
거품 정렬
거품 정렬 은 가장 간단 한 정렬 이다. 즉, 앞 뒤 두 수의 크기 를 비교 하 는 것 이다.
function bubble(arr) {
for(let i = 0, len = arr.length; i < len; i++) {
for(let j = 0; j < len; j++) {
if(arr[j] > arr[j + 1]) {
[arr[j], arr[j+1]] = [arr[j+1], arr[j]];
}
}
}
return arr;
}
정렬 선택
정렬 을 선택 하려 면 먼저 최소 값 을 선택해 야 합 니 다. 이 최소 값 을 뒤에 정렬 되 지 않 은 숫자 와 비교 하고 더 작 으 면 위 치 를 바 꿔 야 합 니 다.
function selection(arr) {
let min;
for(let i = 0, len =arr.length; i < len; i++) {
min = arr[i];
for(let j = i+1; j < len; j++) {
if(arr[j] < min) {
[arr[i], arr[j]] = [arr[j], arr[i]];
}
}
}
return arr;
}
삽입 정렬
정렬 원 리 를 삽입 하 는 것 과 포커 를 칠 때 카드 를 순서대로 삽입 하 는 것 은 차이 가 많 지 않다. 두 번 째 카드 부터 앞 을 보면 숫자 가 두 번 째 카드 보다 작은 지, 처리 한 후에 세 번 째 카드 를 보면 이런 식 으로 유추 하면 n 번 째 카드 에서 n 앞 에 있 는 카드 가 n 번 째 위치 에 있 는 카드 보다 작은 지 여 부 를 볼 수 있다.
function insert(arr) {
for(let i = 1, len = arr.length; i < len; i++) {
let target = arr[i];
for(let j = i; j >=0; j--) {
if(arr[j-1] > target) {
arr[j] = arr[j-1];
} else {
arr[j] = target;
break;
}
}
}
return arr;
}
힐 정렬
힐 정렬 은 정렬 을 삽입 하 는 토대 에서 개 선 된 것 입 니 다. 매번 1 의 거리 가 아 닌 간격 을 설정 합 니 다. 간격 은 크 고 작은 것 이 며 마지막 은 1 입 니 다.
에서 Robert Sedgewick 은 동적 정의 간격 서열 을 제시 했다.(이해 하기 편 하도록 동적 정의 가 없습니다)
function shell(arr) {
let gaps = [5, 3, 1];
gaps.forEach((gap) => {
for(let i = gap, len = arr.length; i < len; i++) {
let target = arr[i];
for(let j = i; j >=0; j -= gap) {
if(arr[j - gap] > target) {
arr[j] = arr[j - gap];
} else {
arr[j] = target;
break;
}
}
}
});
return arr;
}
빠 른 정렬
빠 른 정렬 은 하나의 기준 을 선택 한 다음 에 이 기준 보다 큰 것 을 한쪽 으로 하고 이 기준 보다 작은 것 을 다른 쪽 으로 한 다음 에 이 양쪽 을 같은 규칙 으로 처리 하 는 것 이다.이분법 과 유사 하 다.
function quick(arr) {
if(arr <= 1) {
return arr;
}
// mid arr
var mid = arr.shift();
var left = [];
var right = [];
arr.forEach((value) => {
if(value <= mid) {
left.push(value);
} else {
right.push(value);
}
});
return quick(left).concat(mid, quick(right));
}
정렬
이것 은 저도 설명 하기 어렵 습 니 다. 공식 적 인 표현 을 복사 하 겠 습 니 다.
병합 정렬 은 병합 작업 에 있어 효과 적 인 정렬 알고리즘 으로 이 알고리즘 은 분 치 법 (Divide and Conquer) 을 사용 하 는 매우 전형 적 인 응용 이다.기 존 서열 의 하위 서열 을 합쳐서 완전히 질서 있 는 서열 을 얻는다.즉, 모든 하위 서열 을 질서 있 게 한 다음 에 하위 서열 을 질서 있 게 하 는 것 이다.두 개의 질서 표를 하나의 질서 표 로 합치 면 2 번 병합 이 라 고 합 니 다.
다음은 제 가 찾 은 비교 이미지 의 병합 정렬 그림 입 니 다.
여 기 는 그림 데모 입 니 다.
function merge(arr) {
var len = arr.length;
if(len <= 1) {
return arr;
}
var midIndex = Math.floor(len/2);
var left = arr.slice(0, midIndex);
var right = arr.slice(midIndex);
return mergeSort(merge(left), merge(right));
}
function mergeSort(left, right) {
var res = [];
while(left.length && right.length) {
if(left[0] < right[0]) {
res.push(left.shift());
} else {
res.push(right.shift());
}
}
while(left.length) {
res.push(left.shift());
}
while(right.length) {
res.push(right.shift());
}
return res;
}
각 정렬 알고리즘 의 복잡 도와 안정성 비교
알고리즘 종류
평균 시간 복잡 도
최 악의 시간 복잡 도
최 적 시간 복잡 도
공간 복잡 도
안정성
거품 정렬
O(n2)
O(n2)
O(n)
O(1)
안정시키다
정렬 선택
O(n2)
O(n2)
O(n2)
O(1)
불안정
삽입 정렬
O(n2)
O(n2)
O(n)
O(1)
안정시키다
힐 정렬
O(nlogn)
O(nlog2n)
O(nlog2n)
O(1)
불안정
빠 른 정렬
O(nlogn)
O(n2)
O(nlogn)
O(logn)
불안정
정렬
O(nlogn)
O(nlogn)
O(nlogn)
O(n)
안정시키다
더미 정렬
O(nlogn)
O(nlogn)
O(nlogn)
O(1)
불안정
(아직 정렬 을 이해 할 수 없습니다. 이 진 트 리 를 보고 정렬 을 연구 하면 정렬 된 내용 을 업데이트 할 수 있 습 니 다.)
각종 정렬 알고리즘 데모
여 기 를 누 르 면 각종 정렬 알고리즘 시연 을 볼 수 있 습 니 다.
총결산
전단 에서 이해 해 야 할 알고리즘 은 많 지 않 지만 알고리즘 을 최대한 많이 배 우 는 것 이 일부 코드 최적화 에 도움 이 되 고 나중에 다른 언어 를 배우 거나 깊이 공부 하 는 데 편리 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.