1. 程式人生 > >幾種排序演算法實現以及穩定性

幾種排序演算法實現以及穩定性

穩定性演算法:氣泡排序、插入排序、歸併排序、基數排序

不穩定性演算法:選擇排序、快速排序、堆排序、希爾排序、桶排序

/**
 * 
 * @author huangsen
 * 插入排序:一個有序陣列,一個無序陣列,將無序陣列插入到有序陣列中
 *
 */

public class InsertSortDemo {
    
    public static void insertSort(int[] arr) {
        for(int i = 1; i < arr.length; i++) {
            int temp = arr[i];
            int j;
            for(j = i -1; j>=0; j--) {
                if(temp > arr[j]) {
                    break;                                    
                }else {
                    arr[j+1] = arr[j];
                }
                
            }
            arr[j+1] = temp;
        }
        
    }
        
}
 

package com.hs.sort;

/**
 * 
 * @author huangsen
 * 歸併排序:採用分治思想,對一個數組的排序,我們可以將他分成兩個陣列來處理,再對這兩個陣列同樣的道理來處理,
 * 將他們分別分成兩個陣列來處理…… 直到陣列無法再細分下去(即陣列的長度為1,只有一個元素的陣列肯定是有序的),
 * 分為之後的陣列進行合併操作,向上整合整個陣列,最後到達得到一個有序的陣列的目的。
 *
 */

public class MergeSortDemo {
    public static void mergeSort(int[] arr, int start, int end) {
        if(start<end) {
            int mid = (start + end)/2;
            mergeSort(arr, start, mid);
            mergeSort(arr,mid + 1, end);
            merge(arr, start, mid, mid + 1, end);
            
        }
        
    }
    
    public static void merge(int[] arr, int start1, int end1, int start2, int end2) {
        int i = start1;
        int j = start2;
        int k = 0;
        int[] a = new int[end2-start1+1];
         while((i<=end1) && (j<=end2)) {
            if(arr[i]<arr[j]){
                a[k] = arr[i];
                k++;
                i++;        
            }else {
                a[k] = arr[j];
                k++;
                j++;        
            }        
        }
         while(i<=end1) {
            a[k++] = arr[i++];
            
        }
        while(j<=end2) {
            a[k++] = arr[j++];
            
        }
        for(int m = 0; m<a.length; m++)
            arr[m+start1] = a[m];
        
    }

}

package com.hs.sort;

/**
 * @author huangsen
 * 選擇排序:在要排序的一組數中,選出最小的一個數與第一個位置的數交換;然後在剩下的數當中再找最小的與第二個位置的數交換,如此迴圈到倒數第二個數和最後一個數比較為止。
 *
 */

public class SelectSortDemo {
    
    public static void selectSort(int[] arr) {
        for(int i = 0; i<arr.length; i++) {
            int k = i;
            for(int j = i+1; j<arr.length; j++) {
                if(arr[j]<arr[k]) {
                    k = j;
                }
            }
            if(k>i) {
                int temp = arr[i];
                arr[i] = arr[k];
                arr[k] = temp;        
                
            }
        }
        
    }

}
 

相關推薦

no