歸并排序算法

歸并排序:算法復(fù)雜度logN

先不斷二分,直到分成單個(gè)元素,無法再分為止,然后比較大小合并處理

import java.util.*;

public class MergeSort {
    public int[] mergeSort(int[] A, int n) {
        if(A.length == 0 || n <= 0) {
            return A;
        }
        
        mergeSort(A, 0, n-1);
        return A;
    }
    
    public void mergeSort(int[] A, int left , int right) {
        if(left >= right) { //注意是>=  相等的時(shí)候代表不可再分
            return;
        }
        
        int mid = left + (right-left)/2;
        mergeSort(A, left, mid); //二分
        mergeSort(A, mid+1, right); //二分
        
        merge(A, left, mid, right); //歸并
    }
    
    public void merge(int[] A, int left, int mid, int right) {
        
        //[left, mid]
        //[mid+1, right]
        
        int[] arr = new int[right-left+1];
        int index = -1;
        int l = left;
        int r = mid+1;
        
        while(l <= mid && r <= right) {
            if(l <= mid && A[l] < A[r]) {
                arr[++ index] = A[l ++];
            } 
            else if(r <= right && A[r] <= A[l]) {
                arr[++ index] = A[r ++];
            } 
        }
        
        while(l <= mid) {
            arr[++ index] = A[l ++];
        }
        
        while(r <= right) {
            arr[++ index] = A[l ++];
        }
        
        
        for(int i = 0; i < right-left+1; i++) {
            A[left+i] = arr[i];
        }
    }
}

快速排序

  • 思想:隨機(jī)在數(shù)組中選擇一個(gè)數(shù)據(jù)random, <random的放在左邊 >random的放在右邊,然后左邊, 右邊分別快排
import java.util.*;

public class QuickSort {
    public int[] quickSort(int[] A, int n) {
        if(A.length == 0 || n <= 0) {
            return A;
        }
        
        quickSort(A, 0, n-1);
        return A;
    }
    
    public void quickSort(int[] A, int left, int right) {
        if(left >= right) {
            return;
        }
        
        int index = partition(A, left, right);
        
        quickSort(A, left, index-1);
        quickSort(A, index+1, right);
    }
    
    public int partition(int[] A, int left, int right) {
        //分割
        
        int comparator = A[right];
        int l = left-1;
        
        for(int i = left; i < right; i++) {
            if(A[i] < comparator) {
                swap(A, ++l, i);
            }
        }
        
        swap(A, ++ l, right);
        
        return l;
    }
    
    public void swap(int[] A, int l, int r) {
        int tmp = A[l];
        A[l] = A[r];
        A[r] = tmp;
    }
}

堆排序

import java.util.*;

public class HeapSort {
   
    
    public int[] heapSort(int[] A, int n) {
        if(A.length == 0 || n <= 0) {
            return A;
        }
        
        for(int i = n/2-1; i >= 0; i--) {
            shiftUp(A, i, n-1);
        }
        
        for(int j = n-1; j > 0; j--) {
            swap(A, 0, j);
            shiftUp(A, 0, j-1);
        }
        
        return A;
    }
    public void swap(int[] A, int start, int end) {
            int tmp = A[start];
            A[start] = A[end];
            A[end] = tmp;
        }
        
     
        
        public void shiftUp(int[] A, int start, int end) {
            if(start >= end) {
                return;
            }
            
            int parent = start;
            int child = parent*2 + 1; //左子節(jié)點(diǎn)
            int val = A[parent];
            
            while(child <= end) {
                
                if(child < end && A[child] < A[child+1]) { //這里child < end 必須, 否則下面child++會(huì)超出范圍
                    child++;
                }
                
                if(A[child] > val) {
                    A[parent] = A[child];
                    parent = child;
                    child = parent*2+1;
                } else {
                    break;
                }
            }
            
            A[parent] = val;
        }
        
    
}

希爾排序

import java.util.*;

public class ShellSort {
    public int[] shellSort(int[] A, int n) {
        if(A.length == 0 || n <= 0) {
            return A;
        }
        
        int feet = n/2;
        int index = 0;
        while(feet > 0) {
            for(int i = feet; i<n; i++) {
                index = i;
                
                while(index >= feet) {  //注意這里的循環(huán), 必須到達(dá)最前方
                    if(A[index] < A[index-feet]) {
                        swap(A, index, index-feet);
                        index = index - feet;
                    } else {
                        break;
                    }
                }
            }
            feet /= 2;
        }
        
        return A;

    }
    
    public void swap(int[] A, int i, int j) {
        int tmp = A[i];
        A[i] = A[j];
        A[j] = tmp;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容