자바 정렬 알고리즘 그림 설명

1.직접 정렬 삽입
기본 사상:
정렬 된 질서 있 는 표 에 기록 을 삽입 하여 삽 입 된 표 가 질서 있 게 합 니 다.
초기 키워드{49 38 65 97 76 13 27 49}직접 삽입 정렬
在这里插入图片描述

package Sort;
//    
public class InsertSort {
    public static void main(String[] args) {
        int [] arr={49,38,65,97,76,13,27,49};
        sort(arr);
       print(arr);
    }
    private static void sort(int [] arr) {
        for (int i = 1; i < arr.length; i++) {
           for(int j=i;j>0;j--){
               if(arr[j]<arr[j-1]){
                  swap(arr,j,j-1);
               }
           }
        }
    }
    private static void swap(int [] arr,int i,int j){
        int temp=0;
        temp=arr[i];
        arr[i]=arr[j];
        arr[j]=temp;
    }
    private static void print(int [] arr) {
        for (int i = 0; i <arr.length ; i++) {
            System.out.print(arr[i]+" ");
        }
    }
}
13 27 38 49 49 65 76 97
Process finished with exit code 0
2.힐 정렬
힐 정렬 은'증 량 축소 정렬'Diminishing Increment Sort))이 라 고도 부 르 는데 삽입 정렬 클래스 에 속한다.
기본 사상:
먼저 전체 정렬 대기 기록 을 몇 개의 하위 서열 로 나 누 어 각각'직접 삽입 정렬'을 하고 전체 서열 중의 기록'이 기본적으로 질서 가 있 을 때 전체 기록 에 대해 직접 삽입 정렬 을 한다.
在这里插入图片描述

package Sort;
//            
public class ShellSort {
    public static void main(String[] args) {
        int [] arr={16,25,12,30,47,11,23,36,9,18,31};
        sort(arr);
        print(arr);
    }
    private static void sort(int [] arr) {
        //gap    
        int h=1;
        while(h<arr.length/3){
            h=h*3+1;
        }
       for(int gap=h;gap>0;gap=(gap-1)/3) {//gap:       
           for (int i = gap; i < arr.length; i++) {
               for (int j = i; j >gap-1; j-=gap) {
                   if (arr[j] < arr[j - gap]) {
                       swap(arr, j, j - gap);
                   }
               }
           }
       }
    }
    private static void swap(int [] arr,int i,int j){
        int temp=0;
        temp=arr[i];
        arr[i]=arr[j];
        arr[j]=temp;
    }
    private static void print(int [] arr) {
        for (int i = 0; i <arr.length ; i++) {
            System.out.print(arr[i]+" ");
        }
    }
}
9 11 12 16 18 23 25 30 31 36 47
Process finished with exit code 0
3.거품 정렬
거품 정렬
4.빠 른 정렬
거품 정렬 개선
기본 사상:
한 번 의 정렬 을 통 해 정렬 대기 기록 을 독립 된 두 부분 으로 나 누 었 는데 그 중의 한 부분의 키 워드 는 모두 다른 부분의 키워드 보다 작 으 면 각각 이 두 부분의 기록 을 계속 정렬 하여 전체 서열 의 질 서 를 달성 할 수 있다.
在这里插入图片描述
在这里插入图片描述

package Sort;
import java.util.Arrays;
//    
public class QuickSort {
    public static void main(String[] args) {
        int[] arr={49,38,65,97,76,13,27,49};
        sort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }
    private static void sort(int [] arr,int start,int end) {
       if(start<end){
           //     0       
           int stared=arr[start];
           //        
           int low=start;
           int height=end;
           //                 
           while(low<height){
               //         
               while(low<height&&stared<=arr[height]){
                   height--;
               }
               //             
               arr[low]=arr[height];
               //         
               while(low<height&&stared>=arr[low]){
                   low++;
               }
               //             
               arr[height]=arr[low];
           }
           arr[low]=stared;
           sort(arr,start,low);
           sort(arr,low+1,height);
       }
    }
    }
[13, 27, 38, 49, 76, 97, 65, 49]
Process finished with exit code 0
5.정렬 선택(Selection Sort)
정렬 선택
여섯,더미 정렬

                             ,          ,    ,  ,         O(nlogn),        。
더 미 는 다음 과 같은 성질 을 가 진 완전 이 진 트 리 입 니 다.모든 노드 의 값 은 좌우 아이의 노드 보다 크 거나 같 습 니 다.큰 꼭대기 더미 라 고 합 니 다.주의:노드 를 요구 하지 않 는 왼쪽 아이의 값 과 오른쪽 아이의 값 의 크기 관계 입 니 다.
모든 결점 의 값 은 그 좌우 아이의 결점 의 값 보다 작 거나 같 아서 작은 지붕 더미 라 고 부른다
1.큰 더미 의 예 를 들 어 설명 한다.
在这里插入图片描述
우 리 는 더미 속 의 결점 을 층 별로 번 호 를 매 겨 배열 에 비 추 는 것 이 바로 아래 와 같다.
在这里插入图片描述
큰 더미 특징:arr[i]>=arr[2 i+1]&&arr[i]>=arr[2 i+2]/i 는 몇 번 째 노드 에 대응 하고 i 는 0 부터 번 호 를 매 긴 다.
2.작은 지붕 더미 예 를 들 어 설명
在这里插入图片描述
작은 더미:arr[i]<=arr[2 i+1]&&arr[i]<=arr[2 i+2]/i 는 몇 번 째 노드 에 대응 하고 i 는 0 부터 번 호 를 매 긴 다.
일반적으로 상승 순 서 는 큰 지붕 더 미 를 사용 하고,하강 순 서 는 작은 지붕 더 미 를 사용한다.
정렬 기본 사상
1.정렬 의 기본 사상 은:
정렬 대기 서열 을 큰 지붕 더미 로 구성 하 다.
이때 전체 서열 의 최대 치 는 지붕 의 뿌리 노드 이다.
이 를 마지막 요소 와 교환 하면 끝 이 최대 치 입 니 다.
그 다음 에 남 은 n-1 개의 요 소 를 하나의 더미 로 재 구성 하면 n 개의 요소 의 작은 값 을 얻 을 수 있 습 니 다.이렇게 반복 적 으로 집행 하면 질서 있 는 서열 을 얻 을 수 있다.
코드 예시

package Sort;
import java.util.Arrays;
/**     
 * 1、                       i=1 ;arr[i]=6    i=0                            
 *     4                   i        ,    :              9   
 *    /\                         4                                  /\
 *   6  8                       /\                                 6  8
 *  /\                         9  8                               /\
 * 5 9                        /\                                 5 4
 *                           5 6
 */

public class HeapSort {
    public static void main(String[] args) {
        int [] arr={4,6,8,5,9};
        heapSort(arr);
    }
    //          
    public static void heapSort(int[] arr){
        int temp=0;
        for(int i=arr.length/2-1;i>=0;i--){
            adjustHeap(arr,i,arr.length);
        }
        //              ,         ,           
        //      ,       ,               ,          ,         
        for(int j=arr.length-1;j>0;j--) {
            //  
            temp = arr[j];
            arr[j] = arr[0];
            arr[0] = temp;
            adjustHeap(arr, 0, j);
        }
        System.out.println("  "+Arrays.toString(arr));
    }
    //           
    /**
     *   :    i                
     *   :int[]arr={4,6,8,5,9};=>i=1=>adjustHeap=>  {4,9,8,5,6}
     *       adjustHeap  i=0,{4,9,8,5,6}=>  {9,6,8,5,4}
     * @param arr          
     * @param i                 
     * @param length              ,length     
     */
    public static void adjustHeap(int[]arr,int i,int length){
         int temp=arr[i];//         ,        
        //    
        //k=i*2+1;k i       
        for(int k=i*2+1;k<length;k=k*2+1){
              if(k+1<length&&arr[k]<arr[k+1]){//                
                 k++;//k      
              }
              if(arr[k]>temp){//          
                  arr[i]=arr[k];//           
                  i=k;//!!!i  k,      
              }else{
                  break;
              }
        }
        // for     ,    i              (  )
          arr[i]=temp;// temp          
    }
}
정렬 결과 쌓 기:
배열[4,5,6,8,9]
7.병합 정렬
정의:
또 다른 정렬 방법 은 두 개 이상 의 질서 표를 합 쳐 새로운 질서 표 로 만든다.
보조 공간 필요:O(n) 전체 병합[log2n]회 필요
시간 복잡 도:O(nlog2n) 단점:병합 정렬 은 추가 저장 소 를 많이 차지 하고 원래 정렬 대상 배열 과 같은 크기 의 보조 배열 이 필요 합 니 다.
장점:병합 정렬 은 안정 적 인 정렬 방법 입 니 다.
사고방식 은'다 중 병합'까지 보급 할 수 있다
외부 정렬
在这里插入图片描述
在这里插入图片描述

package Sort;
//    
public class MergeSort {
    public static void main(String[] args) {
        int [] arr={4,5,7,8,1,2,3,6};
        sort(arr);
        print(arr);
    }
    private static void sort(int [] arr) {
        int mid=arr.length/2;
        int[]temp=new int[arr.length];
        int i=0;//      
        int j=mid+1;//         
        int k=0;
        while(i<=mid&&j<arr.length){
            if(arr[i]<=arr[j]){
               temp[k]=arr[i];
               i++;
               k++;
            }else{
                temp[k]=arr[j];
                j++;
                k++;
            }
        }
        while(i<=mid){temp[k++]=arr[i++];}//      ,     
        while(j<arr.length){temp[k++]=arr[j++];}//      ,     
    }

    private static void print(int [] arr) {
        for (int i = 0; i <arr.length ; i++) {
            System.out.print(arr[i]+" ");
        }
    }
}
1 2 3 4 5 6 7 8
Process finished with exit code 0
총결산
이 글 은 여기까지 입 니 다.당신 에 게 도움 을 줄 수 있 기 를 바 랍 니 다.또한 당신 이 우리 의 더 많은 내용 에 관심 을 가 져 주 기 를 바 랍 니 다!

좋은 웹페이지 즐겨찾기