직접 삽입 정렬 알고리즘 및 관련 Java 버전 코드 구현에 대한 자세한 설명
직접 삽입 정렬
직접 삽입 정렬의 개념은 다음과 같습니다.
1. 정렬할 배열을 정렬된 부분과 정렬되지 않은 부분으로 나눕니다. 첫 번째 An 요소는 정렬된 것으로 간주됩니다.
2. 두 번째 요소부터 시작하여 정렬된 하위 배열에서 요소의 적절한 위치를 찾아 해당 위치에 삽입합니다.
3. 순서가 지정된 하위 배열에 마지막 요소가 삽입될 때까지 위 과정을 반복합니다.
4. 정렬이 완료되었습니다.
예:
아이디어는 매우 간단하지만 코드 작성은 버블 정렬만큼 쉽지 않습니다. 첫째, 적절한 위치를 어떻게 결정합니까? 왼쪽보다 크거나 같나요, 오른쪽보다 작거나 같나요? 아니요, 고려해야 할 경계 조건도 많고 판단도 너무 많습니다. 둘째, 배열에 요소를 삽입하려면 필연적으로 많은 수의 요소를 이동해야 합니다. 이동을 제어하는 방법은 무엇입니까?
사실 이는 알고리즘 자체의 문제는 아니고 프로그래밍 언어와 관련이 있습니다. 때로는 알고리즘 자체가 이미 매우 성숙하여 특정 프로그래밍 언어와 관련하여 약간 수정해야 하는 경우도 있습니다. 여기서 말하는 것은 Java 알고리즘이므로 Java에 대해 이야기해 보겠습니다.
위 문제를 해결하기 위해 두 번째 단계를 약간 개선하여 하위 배열의 시작 위치부터 비교를 시작하지 않고 하위 배열의 끝부터 역순으로 비교를 시작합니다. 삽입해야 할 숫자보다 크면 뒤로 이동합니다. 숫자가 이 숫자보다 크지 않을 때까지 삽입해야 하는 숫자가 이 빈 위치에 배치됩니다. 따라서 다음 코드를 작성할 수 있습니다.
InsertArray.java
public class InsertArray { // 数组 private long[] arr; // 数组中有效数据的大小 private int elems; // 默认构造函数 public InsertArray() { arr = new long[50]; } public InsertArray(int max) { arr = new long[max]; } // 插入数据 public void insert(long value) { arr[elems] = value; elems++; } // 显示数据 public void display() { for (int i = 0; i < elems; i++) { System.out.print(arr[i] + " "); } System.out.println(); } // 插入排序 public void insertSort() { long select = 0L; for(int i = 1; i < elems; i++) { select = arr[i]; int j = 0; for(j = i;j > 0 && arr[j - 1] >= select; j--) { arr[j] = arr[j - 1]; } arr[j] = select; } } }
테스트 클래스:
TestInsertArray.java
public class TestInsertArray { public static void main(String[] args) { InsertArray iArr = new InsertArray(); iArr.insert(85); iArr.insert(7856); iArr.insert(12); iArr.insert(8); iArr.insert(5); iArr.insert(56); iArr.display(); iArr.insertSort(); iArr.display(); } }
알고리즘 성능/복잡성
직접 논의해 보겠습니다. 삽입 알고리즘의 복잡성. 입력에 관계없이 알고리즘은 항상 n-1 라운드의 정렬을 수행합니다. 그러나 각 요소의 삽입 위치가 불확실하고 입력 데이터의 영향을 많이 받기 때문에 그 복잡도는 확실하지 않습니다. 우리는 최선의 상황, 최악의 상황, 평균적인 상황에 대해 논의할 수 있습니다.
1. 최선의 경우: 알고리즘의 특성상 정렬되는 배열 자체가 양의 순서(배열이 순서대로 되어 있고 그 순서가 요구되는 순서와 동일할 때)가 가장 좋다고 볼 수 있습니다. , 이는 논의의 전제에 따른 오름차순입니다. 그 이유는 이 경우 각 요소를 한 번만 비교하면 되고 이동할 필요가 없기 때문입니다. 알고리즘의 시간 복잡도는 O(n);
2입니다. 최악의 경우: 분명히 정렬할 배열이 역순인 경우입니다. 이 경우 각 라운드의 비교 횟수는 i입니다. -1, 할당 개수는 i 입니다. 전체 차수는 계열 2n-1의 첫 번째 n 항의 합, 즉 n^2입니다. 알고리즘의 시간 복잡도는 O(n^2)입니다.
3. 분석을 통해 평균 사례 알고리즘을 얻을 수 있습니다. 작업 수는 대략 (n^2)/2입니다. (참고: 여기서 계산은 할당 및 비교를 기반으로 합니다. 이동 및 비교를 기반으로 하는 경우 약 n^2입니다. /4) 분명히 시간 복잡도는 여전히 O(n^2 )입니다.
알고리즘의 공간 복잡도와 관련하여 모든 이동은 데이터 내에서 수행됩니다. 유일한 오버헤드는 임시 변수(일부 데이터 구조 서적에서는 "센티넬"이라고 함)를 도입한다는 것입니다. 따라서 공간 복잡도(추가 공간) O(1)이다.
알고리즘 안정성
현재 개수보다 크지 않은 위치만 찾고 교환할 필요도 없기 때문에 직접 삽입 정렬이 안정적인 정렬 방법입니다.
알고리즘 변형
정렬할 데이터가 많은 경우 매번 뒤에서 앞으로 검색하면 오버헤드가 많이 발생하므로 이진 검색(이진 검색)을 사용합니다. )를 사용하여 성능을 향상할 수 있습니다. 이진 검색은 매우 효율적이고 O(㏒n) 복잡도를 보장하기 때문에 데이터가 많거나 입력 데이터가 최악의 경우에 검색 효율성을 크게 향상시킬 수 있습니다. 이 방법을 일부 책에서는 반삽입 정렬이라고 합니다. 코드 구현은 상대적으로 복잡하므로 나중에 시간이 나면 게시하겠습니다.
그 밖에도 양방향 삽입 정렬과 테이블 삽입 정렬이 있습니다. 양방향 삽입 정렬은 반 삽입 정렬을 기반으로 더욱 개선되었으며 이동 횟수가 약 n^2/8로 크게 줄어듭니다. 그러나 이동 횟수를 제거하거나 복잡성 수준을 낮추지는 않습니다. 테이블 삽입 정렬은 저장 구조를 완전히 변경하고 레코드를 이동하지 않지만 연결 목록을 유지하고 이동 레코드를 연결 목록의 포인터 수정으로 교체해야 합니다. 따라서 복잡도는 여전히 O(n^2)입니다.
양방향 삽입 정렬과 테이블 삽입 정렬은 Yan Weimin과 Wu Weimin이 편집한 책 "데이터 구조"를 참조하세요.
알고리즘 적용 시나리오
O(n^2)의 복잡성으로 인해 배열이 큰 경우 삽입 정렬을 적용할 수 없습니다. 하지만 데이터의 양이 상대적으로 적을 때 좋은 선택이며, 일반적으로 퀵 정렬의 확장으로 사용됩니다. 예를 들어 STL의 정렬 알고리즘과 stdlib의 qsort 알고리즘에서는 삽입 정렬이 퀵 정렬의 보완 수단으로 사용되어 적은 수의 요소를 정렬합니다. 또 다른 예로 JDK 7 java.util.Arrays에서 사용하는 정렬 메소드 구현 시 정렬할 배열의 길이가 47보다 작을 경우 삽입 정렬을 사용하게 된다.
직접 삽입 정렬 알고리즘에 대한 자세한 설명과 관련 Java 버전 코드 구현 관련 글은 PHP 중국어 홈페이지를 주목해주세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











일부 애플리케이션이 제대로 작동하지 않는 회사의 보안 소프트웨어에 대한 문제 해결 및 솔루션. 많은 회사들이 내부 네트워크 보안을 보장하기 위해 보안 소프트웨어를 배포 할 것입니다. ...

데이터베이스 작업에 MyBatis-Plus 또는 기타 ORM 프레임 워크를 사용하는 경우 엔티티 클래스의 속성 이름을 기반으로 쿼리 조건을 구성해야합니다. 매번 수동으로 ...

시스템 도킹의 필드 매핑 처리 시스템 도킹을 수행 할 때 어려운 문제가 발생합니다. 시스템의 인터페이스 필드를 효과적으로 매핑하는 방법 ...

IntellijideAultimate 버전을 사용하여 봄을 시작하십시오 ...

많은 응용 프로그램 시나리오에서 정렬을 구현하기 위해 이름으로 이름을 변환하는 솔루션, 사용자는 그룹으로, 특히 하나로 분류해야 할 수도 있습니다.

Java 객체 및 배열의 변환 : 캐스트 유형 변환의 위험과 올바른 방법에 대한 심층적 인 논의 많은 Java 초보자가 객체를 배열로 변환 할 것입니다 ...

데이터베이스 쿼리에 tkmyBatis를 사용하는 경우 쿼리 조건을 구축하기 위해 엔티티 클래스 변수 이름을 우아하게 가져 오는 방법이 일반적인 문제입니다. 이 기사는 고정 될 것입니다 ...

스프링 프로젝트 스타트 업에서 원형 종속성의 무작위성을 이해하십시오. Spring Project를 개발할 때는 프로젝트 시작시 원형 종속성으로 인한 무작위성에 직면 할 수 있습니다 ...
