자바 버 전 10 대 정렬 고전 알고리즘:전체 코드(2)

빠 른 정렬
간단 한 설명:
빠 른 순 서 는 매번 에 하나의 기점(첫 번 째 요소)을 찾 은 다음 에 두 명의 보초병 이다.하 나 는 맨 앞에서 뒤로 가 고 하 나 는 마지막 면 에서 앞으로 가 는 것 이다.만약 에 뒤에 있 는 보초병 이 기점 보다 큰 수 를 찾 아 멈 추 면 앞 에 있 는 보초병 은 기점 보다 큰 수 를 찾 아 멈 춘 다음 에 두 보초병 이 찾 은 수 를 교환 하 는 것 이다.마지막 보초병 두 명 을 찾 지 못 하면 만 나 서 끝난다.마지막 에 기점 과 보초병 이 만 나 는 곳 의 요 소 를 교환 한 다음 에 하나의 서열 을 기점 보다 작은 부분 과 기점 보다 큰 부분 으로 나 눈 다음 에 왼쪽 부분 과 오른쪽 부분 으로 나 누 면 마지막 결 과 는 질서 가 있다.

전체 코드:

package com.keafmd.Sequence;
/**
 * Keafmd
 *
 * @ClassName: QuickSort
 * @Description:     
 * @author:       
 * @date: 2021-06-24 10:32
 */
public class QuickSort {
    //    
    public static void quickSort(int[] arr) {
        quickSort(arr, true);
    }
    public static void quickSort(int[] arr, boolean ascending) {
        if (ascending) {
            quickSort(arr, 0, arr.length - 1, true);
        } else {
            quickSort(arr, 0, arr.length - 1, false);
        }
    }
    public static void quickSort(int[] arr, int begin, int end, boolean ascending) {
        if (ascending)
            quickSort(arr, begin, end);
        else
            quickSortDescending(arr, begin, end);
    }
    //      --   
    public static void quickSort(int[] arr, int begin, int end) {
        if (begin > end) { //    
            return;
        }
        int base = arr[begin];
        int i = begin, j = end;
        while (i < j) { //     (i  ,j  )    
            while (arr[j] >= base && i < j) { //  j    base  
                j--;
            }
            while (arr[i] <= base && i < j) { //  i    base  
                i++;
            }
            if (i < j) { //         
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
        //       i j         
        arr[begin] = arr[i];
        arr[i] = base;
        quickSort(arr, begin, i - 1); //        
        quickSort(arr, i + 1, end); //        
    }
    //     
    public static void quickSortDescending(int[] arr, int begin, int end) {
        if (begin > end) { //    
            return;
        }
        int base = arr[begin];
        int i = begin, j = end;
        while (i < j) { //     (i  ,j  )    
            while (arr[j] <= base && i < j) { //  j    base  
                j--;
            }
            while (arr[i] >= base && i < j) { //  i    base  
                i++;
            }
            if (i < j) { //         
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
        //       i j         
        arr[begin] = arr[i];
        arr[i] = base;
        quickSortDescending(arr, begin, i - 1); //        
        quickSortDescending(arr, i + 1, end); //        
    }
}
직접 정렬 선택
간단 한 설명:
배열 은 정렬 된 부분(앞)과 정렬 대기 시퀀스(뒤)로 나 뉜 다.
처음에는 모든 숫자 가 정렬 되 어야 한다 고 확신 했다.
정렬 을 기다 리 는 시퀀스 에서 가장 크 거나 가장 작은 요 소 를 찾 아 앞 에 있 는 정렬 된 부분 에 놓 은 다음 에 정렬 할 범 위 를 계속 좁 히 고 모든 숫자 가 정렬 될 때 까지 계속 찾 습 니 다.

전체 코드:

package com.keafmd.Sequence;
/**
 * Keafmd
 *
 * @ClassName: SelectSort
 * @Description:     
 * @author:       
 * @date: 2021-06-24 10:33
 */
public class SelectSort {
    //      
    public static void selectSort(int[] arr, boolean ascending) {
        for (int i = 0; i < arr.length; i++) {
            int m = i; //          
            for (int j = i + 1; j < arr.length; j++) {
                if (ascending ? arr[j] < arr[m] : arr[j] > arr[m]) {
                    m = j; //                 ,    
                }
            }
            //    
            int temp = arr[i];
            arr[i] = arr[m];
            arr[m] = temp;
        }
    }
    public static void selectSort(int[] arr) {
        selectSort(arr, true);
    }
}
더미 정렬
먼저 큰 무더기 와 작은 무 더 기 를 이해 하고 그림 을 보 세 요.
큰 무더기,부모 결점 의 값 은 모든 아이들 결점 의 값 보다 크다.루트 노드 최대
작은 지붕 더미,부모 결산 점 의 값 은 모든 아이들 이 결산 하 는 값 보다 작다.루트 노드 값 최소

간단 한 설명:
큰 지붕 이나 작은 지붕 구 조 를 구축 하면 맨 위 에 있 는 것 이 최대 치 나 최소 치 입 니 다.그러면 우 리 는 지붕 요 소 를 꺼 낸 다음 에 구 조 를 다시 구축 하고 계속 취하 고 다시 구축 하면 마지막 에 정렬 효 과 를 얻 을 수 있 습 니 다.

전체 코드:

package com.keafmd.Sequence;
/**
 * Keafmd
 *
 * @ClassName: HeapSort
 * @Description:    
 * @author:       
 * @date: 2021-06-24 10:34
 */
public class HeapSort {
    //   
    public static void heapSort(int[] arr) {
        //           ,         ,      
        heapSort(arr, true);
    }
    public static void heapSort(int[] arr, boolean maxheap) {
        //1.     
        for (int i = arr.length / 2 - 1; i >= 0; i--) {
            //             ,        
            sift(arr, i, arr.length , maxheap);
        }
        //2.     +           
        for (int j = arr.length - 1; j > 0; j--) {
            //             ,     ,    ,       
            int temp = arr[j];
            arr[j] = arr[0];
            arr[0] = temp;
            //     
            sift(arr, 0, j , maxheap); //        
        }
    }
    //      
    /**
     *     ,         
     *
     * @param arr          
     * @param parent         
     * @param len         
     * @param maxheap        
     */
    private static void sift(int[] arr, int parent, int len, boolean maxheap) {
        int value = arr[parent]; //       i
        for (int child = 2 * parent + 1; child < len; child = child * 2 + 1) { // parent         ,   2*parent+1   
            if (child+1 < len && (maxheap ? arr[child] < arr[child + 1] : arr[child] > arr[child + 1])) { //            ,child      
                child++; //          ,              
            }
            //            ,          ,          ,  
            //          ,          (      )
            if (maxheap ? value < arr[child] : value > arr[child]) {
                arr[parent]=arr[child];
                parent = child;
            }
            else {//    ,            。
                break;
            }
        }
        arr[parent] =value; // value        

    }
}
총결산
이 글 은 여기까지 입 니 다.당신 에 게 도움 을 줄 수 있 기 를 바 랍 니 다.또한 당신 이 우리 의 더 많은 내용 에 관심 을 가 져 주 실 수 있 기 를 바 랍 니 다!

좋은 웹페이지 즐겨찾기