자바 는 쌓 기 정렬 과 도 해 를 실현 합 니 다.
1.쌓 기 정렬 은 쌓 기 라 는 데이터 구 조 를 이용 하여 디자인 한 정렬 알고리즘 이다.쌓 기 정렬 은 선택 정렬 이다.가장 나 쁘 고 가장 좋 으 며 평균 시간 복잡 도 는 모두 O(nlogn)이 고 불안정 정렬 이다.
2.더 미 는 다음 과 같은 성질 을 가 진 완전 이 진 트 리 입 니 다.모든 노드 의 값 은 좌우 아이의 노드 의 값 보다 크 거나 같 습 니 다.큰 꼭대기 더미 라 고 부 릅 니 다.주의:노드 를 요구 하지 않 는 왼쪽 아이의 값 과 오른쪽 아이의 값 의 크기 관계 입 니 다.
3.모든 결점 의 값 은 그 좌우 아이의 결점 의 값 보다 작 거나 같 아서 작은 지붕 더미 라 고 부른다.
4.큰 무더기 의 예 를 들 어 설명 한다.
큰 지붕 더미 의 특징:
arr[i] >= arr[2*i+1] && arr[i] >= arr[2*i+2] // i
몇 번 째 노드 에 대응 하고 i 는 0 부터 번 호 를 매 긴 다.5.작은 지붕 더미 예 를 들 어 설명 한다.
작은 지붕 더미:
arr[i] <= arr[2*i+1] && arr[i] <= arr[2*i+2] // i
몇 번 째 노드 에 대응 하고 i 는 0 부터 번 호 를 매 긴 다.6.일반적인 상승 순 서 는 큰 지붕 더 미 를 사용 하고 내 림 순 서 는 작은 지붕 더 미 를 사용한다.
정렬 기본 사상
1.정렬 대기 서열 을 하나의 큰 지붕 더미 로 구성한다.
2.이때 전체 서열 의 최대 치 는 바로 지붕 의 뿌리 노드 이다.
3.이 를 마지막 요소 와 교환 하면 끝 이 최대 치 입 니 다.
4.그리고 남 은 n-1 개의 요 소 를 하나의 더미 로 재 구성 하면 n 개의 요소 의 작은 값 을 얻 을 수 있 습 니 다.이렇게 반복 적 으로 집행 하면 질서 있 는 서열 을 얻 을 수 있다.
큰 무 더 기 를 구축 하 는 과정 에서 요소 의 개수 가 점점 줄 어 들 고 마지막 에 질서 있 는 서열 을 얻 는 것 을 볼 수 있다.
정렬 도해 쌓 기
단계 1
구조 초기 더미.주어진 무질서 한 서열 을 큰 꼭대기 로 구성 하 다.
1.주어진 무질서 서열 구 조 는 다음 과 같다 고 가정 한다.
2.이때 우 리 는 마지막 비 엽 결점 부터(엽 결점 은 자연히 조정 할 필요 가 없다.첫 번 째 비 엽 결점 arr.length/2-1=5/2-1=1,즉 아래 의 6 결점)왼쪽 에서 오른쪽으로,아래 에서 위로 조정 한다.
3.두 번 째 비 엽 노드 4 를 찾 습 니 다.[4,9,8]에서 9 요소 가 가장 크 고 4 와 9 가 교환 되 기 때 문 입 니 다.
4.이때 교환 으로 인해 자근[4,5,6]의 구조 가 혼 란 스 럽 고 계속 조정 되 었 다.[4,5,6]에서 6 이 가장 크 고 4 와 6 을 교환 했다.
이때 우 리 는 무질서 한 서열 을 큰 꼭대기 로 만 들 었 다.
단계 2
쌓 인 요소 와 끝 요 소 를 교환 하여 끝 요 소 를 최대 로 합 니 다.그리고 더 미 를 계속 조정 한 다음 에 더 미 를 마지막 요소 와 교환 하여 두 번 째 로 큰 요 소 를 얻 을 수 있 습 니 다.이렇게 교환,재건,교환 을 반복 한다.
1.쌓 아 올 린 원소 9 와 끝 원소 4 를 교환 합 니 다.
2.구 조 를 재 조정 하여 쌓 인 정 의 를 계속 만족 시 킵 니 다.
3.쌓 인 요소 8 과 마지막 요소 5 를 교환 하여 두 번 째 로 큰 요 소 를 얻 을 수 있 습 니 다.
4.후속 과정 을 계속 조정 하고 교환 하 며 이렇게 반복 적 으로 진행 하면 최종 적 으로 전체 순서 가 질서 가 있 게 된다.
코드 구현
public static void headSort(int[] arr){
// ,
for (int i = arr.length / 2 - 1; i >= 0; i--) {
adjust(arr,i,arr.length);
}
// , ,
for (int i = arr.length - 1; i > 0; i--) {
int temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
adjust(arr,0,i);
}
}
/**
*
* @param arr
* @param i
* @param length
*/
public static void adjust(int[] arr,int i,int length){
int temp = arr[i];
for (int k = i * 2 + 1; k < length; k = k * 2 + 1) {
if((k + 1) < length && arr[k] < arr[k + 1])
k++;
if(arr[k] > temp){
arr[i] = arr[k];
i = k;
}else
break;
}
arr[i] = temp;
}
총결산이 글 은 여기까지 입 니 다.당신 에 게 도움 을 줄 수 있 기 를 바 랍 니 다.또한 당신 이 우리 의 더 많은 내용 에 관심 을 가 져 주 실 수 있 기 를 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.