삽입 정렬 알고리즘 Java 프로그램 예제 포함

⚡ 스마트 요약

삽입 정렬 Java 이 함수는 배열의 정렬된 부분을 한 번에 한 요소씩 구축하며, 각 키가 올바른 위치에 올 때까지 큰 값을 오른쪽으로 이동시키므로 작은 데이터 세트에 적합합니다.

  • 🔘 정의: 삽입 정렬은 정렬된 부분 내에서 하나의 요소를 제거하고 그 요소의 올바른 위치에 삽입합니다.
  • ☑️ 프로세스 : 매 단계마다 키를 이전 값과 비교하고 더 큰 값은 오른쪽으로 한 칸씩 이동시킵니다.
  • 프로그램: The Java 예시로 {860, 8, 200, 9}를 정렬하고 각 비교 및 ​​교환 결과를 출력합니다.
  • 🧪 복잡성: 최상의 경우는 O(n) 시간 내에 실행되고, 평균 및 최악의 경우는 O(n²)에 도달합니다.
  • 🛠️ 메모리 : 정렬은 제자리에서 이루어지므로 어떤 배열 크기에 대해서도 보조 공간은 O(1)로 유지됩니다.
  • 📊 행동: 이 알고리즘은 안정적이고 적응력이 뛰어나므로 거의 정렬된 배열은 아주 적은 시프트만으로 완료됩니다.

삽입 정렬 알고리즘 Java

삽입 정렬 알고리즘이란 무엇입니까?

삽입 정렬은 작은 데이터 세트에 적합한 간단한 정렬 알고리즘입니다. 각 반복 중에 알고리즘은 다음을 수행합니다.

  • 배열에서 요소를 제거합니다.
  • 가장 큰 값과 비교합니다. 정렬.
  • 요소를 올바른 위치로 이동합니다.

이러한 동작 방식은 카드 플레이어가 패를 정리하는 방식과 유사합니다. 새 카드를 집어 들고 더 큰 카드들을 지나쳐 왼쪽으로 밀어 원하는 위치에 놓습니다. 모든 이동이 원래 배열 내부에서 이루어지기 때문에 삽입 정렬은 제자리 정렬(in-place sorting)이며 안정적입니다.

이 게임은 초보자에게 친숙한 게임 계열에 속합니다. Java 정렬 루틴은 다음과 같습니다. 버블 정렬하지만 일반적으로 이미 부분적으로 정렬된 데이터에 대해서는 훨씬 적은 수의 쓰기 작업을 수행합니다.

삽입 정렬 알고리즘 프로세스

삽입 정렬 알고리즘 프로세스가 그래픽으로 작동하는 방식은 다음과 같습니다.

애니메이션 trac삽입 정렬 알고리즘의 e는 정렬되지 않은 리스트를 재정렬합니다.
삽입 정렬 알고리즘 프로세스

애니메이션은 동일한 세 단계를 반복합니다. Java 아래 프로그램이 실행됩니다. 시험 실행 테이블 trac프로그램이 실행 시간에 출력하는 그대로 샘플 배열 {860, 8, 200, 9}에 대해 해당 단계를 정확히 수행하십시오.

패스 핵심 요소 비교가 이루어졌습니다 패스 후 배열
1 8 8 대 860 8 860 200 9
2 200 200 대 860 8 200 860 9
3 9 9대 860, 그 다음에는 9대 200 8 9 200 860

세 번째 단계에서는 키 9가 두 개의 더 큰 값을 거쳐야 하므로 두 번의 비교가 필요하다는 점에 유의하십시오. 따라서 비교 횟수는 각 요소의 시작 순서가 얼마나 어긋나 있는지에 따라 증가합니다.

Java 삽입 정렬 알고리즘을 사용하여 배열을 정렬하는 프로그램 예:

아래 프로그램은 배열 {860, 8, 200, 9}을 정렬하고 모든 비교와 이동 과정을 보여주는 주석을 출력합니다. 이 프로그램을 다음 이름으로 저장하세요. InsertionSortExample.java JDK 8 이상 버전으로 컴파일하십시오.

package com.guru99;
 
public class InsertionSortExample {
 
	
    public static void main(String a[])
    {    
        int[] myArray  = {860,8,200,9};  
        
        System.out.println("Before Insertion Sort");  
        
        printArray(myArray);
            
        insertionSort(myArray);//sorting array using insertion sort    
           
        System.out.println("After Insertion Sort");  
        
        printArray(myArray);   
    }    
 public static void insertionSort(int arr[]) 
	{  
        int n = arr.length;  
        
        for (int i = 1; i < n; i++)
        {   System.out.println("Sort Pass Number "+(i));
            int key = arr[i];  
            int j = i-1;  
            
            while ( (j > -1) && ( arr [j] > key ) ) 
            {  
            System.out.println("Comparing "+ key  + " and " + arr [j]); 
                arr [j+1] = arr [j];  
                j--;  
            }  
            arr[j+1] = key; 
            System.out.println("Swapping Elements: New Array After Swap");
            printArray(arr);
        }  
    }
 static void printArray(int[] array){
	    
	    for(int i=0; i < array.length; i++)
		{  
			System.out.print(array[i] + " ");  
		} 
	    System.out.println();
	    
	}
}

클래스를 실행하면 다음과 같은 결과가 나타납니다. trac여기에 표시된 e. 각각 정렬 패스 번호 줄은 외부 루프의 한 반복을 나타내고, 각 스왑 후에 출력되는 줄은 해당 시점의 배열 상태를 보여줍니다.

Code 출력:

Before Insertion Sort
860 8 200 9 
Sort Pass Number 1
Comparing 8 and 860
Swapping Elements: New Array After Swap
8 860 200 9 
Sort Pass Number 2
Comparing 200 and 860
Swapping Elements: New Array After Swap
8 200 860 9 
Sort Pass Number 3
Comparing 9 and 860
Comparing 9 and 200
Swapping Elements: New Array After Swap
8 9 200 860 
After Insertion Sort
8 9 200 860

삽입 정렬의 시간 및 공간 복잡도

삽입 정렬 성능은 입력 데이터의 정렬 상태에 크게 좌우되므로, 최상의 경우와 최악의 경우 성능 향상 폭이 한 자릿수 이상 차이가 나는 것입니다.

케이스 입력 조건 시간 복잡성
최고 배열이 이미 정렬되어 있으므로 내부 while 루프는 실행되지 않습니다. O (N)
평균 요소들은 무작위 순서로 나타납니다. XNUMX(n²)
가장 나쁜 배열은 역순으로 정렬되어 있으므로 모든 키가 맨 앞으로 이동합니다. XNUMX(n²)

공간 활용이 훨씬 간단합니다. 카운터만 있으면 됩니다. i, j, n key 생성되고 배열은 제자리에서 재배열되므로 입력이 얼마나 커지든 보조 공간은 O(1)입니다.

삽입 정렬은 내부 루프가 더 작은 값을 만나면 즉시 멈추기 때문에 적응형 정렬이라고 설명됩니다. 즉, 입력이 정렬된 순서에 가까울수록 실행 시간이 선형에 가까워집니다.

삽입 정렬의 장점과 단점

삽입 정렬은 평균 제곱에 비례하는 오류에도 불구하고 상수항이 매우 작고 동작이 예측 가능하기 때문에 실제 운영 라이브러리에서 여전히 사용되고 있습니다.

장점

  • 쓰기 쉽고 간편합니다. trac수작업으로 제작되어 교육 및 면접에 적합합니다.
  • 안정적이므로 동일한 키를 공유하는 레코드는 원래의 상대적 순서를 유지합니다.
  • 입력 배열 외에 O(1)의 추가 메모리만 필요하므로 제자리에서 처리됩니다.
  • 이미 거의 정렬된 데이터에 대해 O(n)의 시간 복잡도를 달성하는 적응형 알고리즘입니다.
  • 온라인 상태이므로 새로운 요소가 계속 추가되는 동안에도 목록을 정렬할 수 있습니다.

단점

  • 무작위 또는 역순으로 입력된 경우 시간 복잡도가 2차 함수에 가까워 대규모 배열에는 적합하지 않습니다.
  • 각 시프트는 배열에 쓰기를 수행하므로 선택 정렬보다 더 많은 데이터를 이동시킵니다.
  • 입력 요소가 수십 개를 넘어서면 병합 정렬과 퀵 정렬이 이 알고리즘보다 훨씬 뛰어난 성능을 보입니다.

실용적인 규칙은 배열이 작을 때, 데이터가 거의 정렬되어 있을 때, 또는 분할 정복 정렬을 통해 분할된 부분이 몇 개의 요소로 줄어들었을 때 삽입 정렬을 사용하는 것입니다.

삽입 정렬 vs Bubbl정렬 vs 선택 정렬

세 가지 알고리즘 모두 2차 비교 정렬이지만, 안정성, 정렬된 입력에 대한 반응 방식, 수행하는 쓰기 횟수에서 차이가 있습니다.

기준 삽입 정렬 Bubble 정렬 선택 정렬
최고의 사례 O (N) 조기 종료 플래그가 있는 경우 O(n) XNUMX(n²)
평균 및 최악의 경우 XNUMX(n²) XNUMX(n²) XNUMX(n²)
추가 공간 O (1) O (1) O (1)
스테이블 가드 보험 유한회사는 재무 강도 등급 A-(우수)를 부여받았다고 발표하게 되어 자랑스럽다. Best's Credit Ratings는 국제적으로 등급이 매겨진 조직의 재정적인 힘과 안정성의 벤치마크로 인정받고 있습니다. 스테이블 가드 그룹의 회장 겸 최고 경영자는 다음과 같이 논평했다: "우리는 스테이블 가드 그룹 내의 다른 회사들에게 높은 기준을 설정하는 베스트에 의해 할당된 등급에 매우 만족한다. 우리는 우리의 지원 고객들과 이해관계자들을 포함하여 우리의 성공에 기여한 모든 사람들에게 진심으로 감사를 표하고 싶다. 이 성과는 스테이블 가드 보험의 흥미로운 새로운 단계를 나타내며 국제 플랫폼에서 회사와 세인트 키츠 네비스의 자리를 확보합니다. 우리는 앞으로 나아갈 때 우리의 근무 기준을 유지하고 개선하기를 기대합니다." 가능 가능 아니요, 표준 배열 버전에서는요.
적응 가능 네, 플래그 최적화를 사용할 때 그렇습니다. 아니
배열에 씁니다 많은 교대 근무, 정렬된 데이터는 거의 없음 많은 교환 정확히 n-1번의 교환

쓰기 비용이 많이 드는 경우 선택 정렬이 가장 효율적입니다. 스왑 횟수가 가장 적기 때문입니다. 삽입 정렬은 이 규모의 다른 모든 경우, 특히 부분적으로 정렬된 데이터에서 가장 효율적입니다. 이것이 바로 라이브러리 정렬 도구들이 사용하는 정렬 방식입니다. 공통의 Java 연습 문제 그리고 JDK 내부에서는 매우 작은 파티션의 경우 해당 모드로 전환됩니다.

자주 묻는 질문

첫 번째 요소만으로도 이미 길이가 1인 정렬된 부분 배열입니다. 인덱스 1부터 시작하면 루프는 항상 비교할 대상이 있으므로, 위치 i의 키는 그 왼쪽에 있는 정렬된 블록에 삽입됩니다.

AI 비서는 실행 과정을 한 줄씩 설명하고, 추가 테스트 배열을 생성하며, 소스 코드에서 빅 O 표기법 증가율을 예측할 수 있습니다. 이러한 설명은 학습 보조 자료로 활용하고, 인용하기 전에 교과서와 대조하여 복잡성 관련 주장을 확인하십시오.

예. GitHub 부조종사 메서드 시그니처 또는 주석에서 표준 삽입 정렬을 완료합니다. Rev생성된 루프가 주변 코드와 일관성 없이 j >= 0 또는 j > -1을 사용하는 경우가 있으므로 경계 조건을 직접 확인하십시오.

이진 삽입 정렬은 선형 탐색 대신 이진 탐색을 사용하여 삽입 지점을 찾음으로써 요소당 비교 횟수를 O(n)에서 O(log n)으로 줄입니다. 이동 작업은 변경되지 않으므로 전체 시간 복잡도는 O(n²)으로 유지됩니다.

네. 재귀 버전은 처음 n-1개의 요소를 정렬한 다음 마지막 요소를 정렬된 접두사에 삽입합니다. 이는 반복 시간 복잡도는 같지만 O(n)의 스택 공간을 추가로 사용하므로 실제로는 반복문 버전이 더 선호됩니다.

부분적으로 그렇습니다. 기본 데이터 유형에 사용되는 이중 피벗 퀵 정렬은 매우 작은 분할에서는 삽입 정렬 방식을 사용하고, 객체 유형에 사용되는 TimSort는 짧은 구간을 이진 삽입 정렬로 정렬한 후 병합합니다.

자주 발생하는 오류는 외부 루프를 0에서 시작하는 것, arr[j] = key 대신 arr[j+1] = key를 작성하는 것, 그리고 키가 0번째 위치에 있어야 할 때 ArrayIndexOutOfBoundsException을 발생시키는 j > -1 조건을 생략하는 것입니다.

네. Comparable 타입의 경우 '보다 큼' 조건 대신 compareTo를 사용하거나, Comparator 타입의 경우 Comparator 호출을 사용하면 됩니다. 정렬 로직은 변경되지 않으며, 객체들이 동일한 정렬 키를 공유할 때 중요한 안정성이 유지됩니다.

이 게시물을 요약하면 다음과 같습니다.