プログラマーが知っておくべき8大経典の内部ソート---java版

20587 ワード

package paixu;

public class paixu {

    public static void main(String[] args) {
        sort qs = new sort();
        int i[] = { 49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51 };
        qs.quiteSort(i, 0, i.length - 1);
//      qs.bubblesort(i);
//      int[] spans = {5,3,1};
//      qs.shellSort(i, spans);
//      qs.insertSort(i);
//      qs.selectSort(i);
//      qs.heapSort(i);
//      qs.mergeSort(i, 0, i.length - 1);
//      qs.radixSort(i, 10);
        for (int data : i) {
            System.out.print(data + " ");
        }
    }
}
/*       8     
 *     :    &  
 *     :    & 
 *     :  &  
 *     
 *     
 */
class sort {
    /*     
     *      ,
     *       ,     ,
     *                 */
    public void quiteSort(int data[], int low, int hight) {
        if (low < hight) {
            int pivotpos = partition(data, low, hight);
            quiteSort(data, low, pivotpos - 1);
            quiteSort(data, pivotpos + 1, hight);
        }
    }
    private int partition(int[] data, int low, int high) {//      low     
        int pivot = data[low];
        while (low < high) {
            while (low < high && pivot <= data[high]) {//      povite ,     ,    
                high--;
            }
            data[low] = data[high];
            while (low < high && data[low] <= pivot) { //        povite ,    ,    
                low++;
            }
            data[high] = data[low];
        }
        data[low] = pivot;
        return low;
    }
    
    /*     
     *     ,        ,
     *             。
     *    , ;   , */
    public void bubblesort(int[] data) {
        for (int i = 1; i < data.length; i++) {
            boolean exchange = false;
            for (int j = 0; j < data.length - i; j++) {
                if (data[j] > data[j + 1]) { //   
                    int temp = data[j];
                    data[j] = data[j + 1];
                    data[j + 1] = temp;
                    exchange = true;
                }
            }
            if (!exchange)
                break;
        }
    }
    
    /*     
     *       ,
     *        :5,3,1,
     *      :     1,      */
    public void shellSort(int[] data, int[] spans) {
        for (int i = 0; i < spans.length; i++) { //       
            int span = spans[i];
            for (int j = 0; j < span; j++) {//     
                for (int k = j + span; k < data.length; k = k + span) { //     
                    int temp = data[k];
                    int pre = k - span;
                    while (pre >= 0 && data[pre] > temp) {
                        data[pre + span] = data[pre];
                        pre = pre - span;
                    }// end while
                    data[pre + span] = temp;
                }// end for
            }
        }// end for
    }// end shellSort

    /*       
     *        ,
     *              */
    public void insertSort(int[] data) {
        for (int i = 1; i < data.length; i++) {
            int tmp = data[i];
            if (tmp < data[i - 1]) {
                int j = i - 1;
                for (; j >= 0 && data[j] > tmp; j--) {
                    data[j + 1] = data[j];
                }
                data[j + 1] = tmp;
            }
        }
    }

    /*       
     *                 ,
     *               */
    public void selectSort(int[] data) {//          
        for (int i = 0; i < data.length; i++) {
            int k = i;
            for (int j = i + 1; j < data.length; j++) {
                if (data[k] > (data[j])) {
                    k = j; //        
                }
            }
            if (k != i) {
                int temp = data[i];
                data[i] = data[k];
                data[k] = temp;
            }
        }
    }

    /*    
     *          ,
     *         ,
     *          ,
     *     ,
     *     */
    public void heapSort(int[] data) {
        buildHeap(data);
        for (int i = data.length - 1; i > 0; i--) {
            int temp = data[0];
            data[0] = data[i];
            data[i] = temp;
            heapify(data, 0, i - 1);
        }
    }
    private void buildHeap(int[] data) {
        for (int i = data.length / 2; i >= 0; i--) {
            heapify(data, i, data.length - 1);
        }
    }
    private void heapify(int[] data, int low, int high) {
        int temp = data[low];
        for (int large = 2 * low + 1; large <= high; large *= 2) {
            if (large < high && data[large] < data[large + 1]) {
                large++;
            }
            if (temp >= data[large]) {
                break;
            }
            data[low] = data[large];
            low = large;
        }
        data[low] = temp;
    }

    /*     
     *               ,
     *                   */
    public void mergeSort(int[] data, int left, int right) {
        if (left < right) {
            int center = (left + right) / 2; //       
            mergeSort(data, left, center); //          
            mergeSort(data, center + 1, right); //          
            merge(data, left, center, right); //   
        }
    }
    private void merge(int[] data, int left, int center, int right) {
        int[] tmpArr = new int[data.length];
        int mid = center + 1;
        int index = left; // index         
        int tmp = left;
        while (left <= center && mid <= right) { //                  
            tmpArr[index++] = (data[left] <= data[mid]) ? data[left++] : data[mid++];
        }
        while (mid <= right) { //             
            tmpArr[index++] = data[mid++];
        }
        while (left <= center) {
            tmpArr[index++] = data[left++];
        }
        while (tmp <= right) {
            data[tmp] = tmpArr[tmp++];
        }
    }

    /*     
     *                  ,
     *          ,
     *         */
    public void radixSort(int[] data, int d) {//d=10^(n-1),n        
        int k = 0;
        int n = 1;

        int[][] temp = new int[data.length][data.length];
        int[] order = new int[data.length];

        while (n <= d) {
            for (int i = 0; i < data.length; i++) {
                int lsd = ((data[i] / n) % 10);
                temp[lsd][order[lsd]] = data[i];
                order[lsd]++;
            }

            for (int i = 0; i < data.length; i++) {
                if (order[i] != 0) {
                    for (int j = 0; j < order[i]; j++) {
                        data[k] = temp[i][j];
                        k++;
                    }
                    order[i] = 0;        //  
                }
            }
            n *= 10;    //        
            k = 0;        //  
        }
    }
}