排序算法java版

排序是非常常見的問題,將簡單實現9大排序算法
1、創建BaseSort.java

package com.csh.sort;

public abstract class BaseSort {

    protected int data[];
    protected int length;

    public BaseSort(int data[]) {
        this.data = data;
        this.length = this.data.length;
    }

    public final void dispaly() {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < length; i++) {
            sb.append(data[i]);
            if (i != length - 1) {
                sb.append(",");
            }
        }
        System.out.println(sb.toString());
    }

    protected void swap(int i, int j) {
        int temp = data[i];
        data[i] = data[j];
        data[j] = temp;
    }

    public abstract void sort();

}

下面的排序都將繼承此類去實現
2、冒泡排序法BubbleSort.java

package com.csh.sort;

/*
 * 冒泡排序法
 */
public class BubbleSort extends BaseSort {

    public BubbleSort(int[] data) {
        super(data);
    }

    @Override
    public void sort() {
        // TODO Auto-generated method stub
        // 標記是否有交換數據
        boolean flag = true;
        for (int i = 0; i < length && flag; i++) {
            flag = false;
            for (int j = length - 1; j > i; j--) {
                if (data[j] < data[j - 1]) {
                    swap(j, j - 1);

                    flag = true;
                }
            }
        }
    }

}

3、桶式排序BucketSort.java

package com.csh.sort;

/*
 * 桶式排序
 * (1)對於這個可枚舉範圍構建一個buckets數組,用於記錄“落入”每個桶中元素的個數;
(2)將(1)中得到的buckets數組重新進行計算,按如下公式重新計算:
buckets[i] = buckets[i] +buckets[i-1] (其中1<=i<buckets.length); 
 */
public class BucketSort extends BaseSort {

    public BucketSort(int[] data) {
        super(data);
    }

    @Override
    public void sort() {
        // TODO Auto-generated method stub
        int[] mm = getMaxMin();
        int max = mm[0];
        int min = mm[1];
        // 緩存數組
        int[] tmp = new int[length];
        // buckets用於記錄待排序元素的信息
        // buckets數組定義了max-min個桶
        int[] buckets = new int[max - min];
        // 計算每個元素在序列出現的次數
        for (int i = 0; i < length; i++) {
            buckets[data[i] - min]++;
        }
        // 計算“落入”各桶內的元素在有序序列中的位置
        for (int i = 1; i < max - min; i++) {
            buckets[i] = buckets[i] + buckets[i - 1];
        }
        // 將data中的元素完全複製到tmp數組中
        System.arraycopy(data, 0, tmp, 0, data.length);
        // 根據buckets數組中的信息將待排序列的各元素放入相應位置
        for (int k = data.length - 1; k >= 0; k--) {
            data[--buckets[tmp[k] - min]] = tmp[k];
        }
    }

    // 取出最大值,最小值
    private int[] getMaxMin() {
        int mm[] = new int[2];
        mm[0] = data[0];
        mm[1] = data[1];
        for (int i = 1; i < length; i++) {
            if (data[i] > mm[0]) {
                mm[0] = data[i];
            }
            if (data[i] < mm[0]) {
                mm[1] = data[i];
            }
        }

        return mm;
    }

}

4、堆排序HeapSort.java

package com.csh.sort;

/*
 * 堆排序
 */
public class HeapSort extends BaseSort {

    public HeapSort(int[] data) {
        super(data);
    }

    @Override
    public void sort() {
        // TODO Auto-generated method stub
        dispaly();
        for (int i = 0; i < length; i++) {
            createMaxdHeap(length - 1 - i);
            swap(0, length - 1 - i);
            System.out.print(i+"=");
            dispaly();
        }
    }

    private void createMaxdHeap(int lastIndex) {
        for (int i = (lastIndex - 1) / 2; i >= 0; i--) {
            // 保存當前正在判斷的節點
            int k = i;
            // 若當前節點的子節點存在
            while (2 * k + 1 <= lastIndex) {
                // biggerIndex總是記錄較大節點的值,
                // 先賦值爲當前判斷節點的左子節點
                int biggerIndex = 2 * k + 1;
                if (biggerIndex < lastIndex) {
                    // 若右子節點存在,
                    // 否則此時biggerIndex應該等於 lastIndex
                    if (data[biggerIndex] < data[biggerIndex + 1]) {
                        // 若右子節點值比左子節點值大,
                        // 則biggerIndex記錄的是右子節點的值
                        biggerIndex++;
                    }
                }
                if (data[k] < data[biggerIndex]) {
                    k = biggerIndex;
                } else {
                    break;
                }
            }
            if (i != k) {
                swap(k, i);
            }
        }
    }

}

5、歸併排序MergingSort.java

package com.csh.sort;

/*
 *  歸併排序
 */
public class MergingSort extends BaseSort {

    public MergingSort(int[] data) {
        super(data);
    }

    @Override
    public void sort() {
        // TODO Auto-generated method stub
        sortF(0, length - 1);
    }

    private void sortF(int low, int high) {
        int mid = (low + high) / 2;
        if (low < high) {
            // 左邊
            sortF(low, mid);
            // 右邊
            sortF(mid + 1, high);
            // 左右歸併
            merge(low, mid, high);
        }
    }

    private void merge(int low, int mid, int high) {
        int[] temp = new int[high - low + 1];
        int i = low;// 左指針
        int j = mid + 1;// 右指針
        int k = 0;

        // 把較小的數先移到新數組中
        while (i <= mid && j <= high) {
            if (data[i] < data[j]) {
                temp[k++] = data[i++];
            } else {
                temp[k++] = data[j++];
            }
        }

        // 把左邊剩餘的數移入數組
        while (i <= mid) {
            temp[k++] = data[i++];
        }

        // 把右邊邊剩餘的數移入數組
        while (j <= high) {
            temp[k++] = data[j++];
        }

        // 把新數組中的數覆蓋nums數組
        for (int k2 = 0; k2 < temp.length; k2++) {
            data[k2 + low] = temp[k2];
        }
    }

}

6、快速排序QuickSort.java

package com.csh.sort;

/*
 * 快速排序
 */
public class QuickSort extends BaseSort {

    public QuickSort(int[] data) {
        super(data);
    }

    @Override
    public void sort() {
        // TODO Auto-generated method stub
        sortF(0, length - 1);
    }

    private void sortF(int low, int high) {
        int pivot;
        if (low < high) {
            pivot = partition(low, high);
            sortF(low, pivot - 1);
            sortF(pivot + 1, high);
        }
    }

    private int partition(int low, int high) {
        int pivotkey;

        // 優化點
        int m = low + (high - low) / 2;
        //保證左右中的左端最小
        if (data[low] > data[high]) {
            sortF(low, high);
        }
        if (data[m] > data[high]) {
            sortF(m, high);
        }
        if (data[m] > data[low]) {
            sortF(m, low);
        }

        pivotkey = data[low];
        while (low < high) {
            // 重表的兩端像中間掃描
            while (low < high && data[high] >= pivotkey) {
                high--;
            }
            if (low != high) {
                swap(low, high);
            }
            while (low < high && data[low] <= pivotkey) {
                low++;
            }
            if (low != high) {
                swap(low, high);
            }
        }

        return low;
    }

}

7、基數排序

package com.csh.sort;

/*
 * 基數排序
 * 基數排序(Radix sort)是一種非比較型整數排序算法,其原理是將整數按位數切割成不同的數字,然後按每個位數分別比較。
 * 基數排序的方式可以採用LSD(Least significantdigital)或MSD(Most significantdigital),
 * LSD的排序方式由鍵值的最右邊開始,
 * 而MSD則相反,由鍵值的最左邊開始。
 */
public class RadixSort extends BaseSort {

    public RadixSort(int[] data) {
        super(data);
    }

    @Override
    public void sort() {
        // TODO Auto-generated method stub
        lsd();
    }

    // LSD
    private void lsd() {
        int k = 0;
        int n = 1;
        int m = 1;

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

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

            for (int i = 0; i < 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;
        }
    }
}

8、希爾排序ShellSort.java

package com.csh.sort;

/*
 * 希爾排序
 */
public class ShellSort extends BaseSort {

    public ShellSort(int[] data) {
        super(data);
    }

    @Override
    public void sort() {
        // TODO Auto-generated method stub
        // 步長
        for (int gap = length / 2; gap > 0; gap /= 2) {
            for (int j = gap; j < length; j += gap) {
                // 從數組第gap個元素開始
                if (data[j] < data[j - gap])// 每個元素與自己組內的數據進行直接插入排序
                {
                    int temp = data[j];
                    int k = j - gap;
                    while (k >= 0 && data[k] > temp) {
                        data[k + gap] = data[k];
                        k -= gap;
                    }
                    data[k + gap] = temp;
                }
            }
        }
    }

}

8、簡單選擇排序SimpleSelectionSort.java

package com.csh.sort;

/*
 * 簡單選擇排序
 */
public class SimpleSelectionSort extends BaseSort {

    public SimpleSelectionSort(int[] data) {
        super(data);
    }

    @Override
    public void sort() {
        // TODO Auto-generated method stub
        // 最小值座標
        int min = 0;
        for (int i = 0; i < length; i++) {
            min = i;
            for (int j = i + 1; j < length; j++) {
                if (data[j] < data[min])
                    min = j;
            }
            if (min != i) {
                swap(min, i);
            }
        }
    }

}

9、直接插入排序StraightInsertionSort.java

package com.csh.sort;

/*
 * 直接插入排序
 */
public class StraightInsertionSort extends BaseSort {

    public StraightInsertionSort(int[] data) {
        super(data);
    }

    /*
     * 長度必須大於1
     */
    @Override
    public void sort() {
        // TODO Auto-generated method stub
        int temp = 0;
        for (int i = 1; i < length; i++) {
            if (data[i] < data[i - 1]) {
                temp = data[i];
                int j;
                for (j = i - 1; j >= 0 && data[j] > temp; j--) {
                    data[j + 1] = data[j];
                }
                data[j + 1] = temp;
            }
        }
    }

}

10、測試類

package com.csh.sort;

public class Client {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int data[] = { 10, 1, 4, 54, 123, 456, 78, 89, 23, 34, 65, 2, 43, 56,
                100, 3, 4, 50 };
        // BaseSort sort=new BubbleSort(data);
        // BaseSort sort = new SimpleSelectionSort(data);
        // BaseSort sort = new StraightInsertionSort(data);
        // BaseSort sort = new ShellSort(data);
        // BaseSort sort = new HeapSort(data);
        // BaseSort sort = new MergingSort(data);
        // BaseSort sort = new QuickSort(data);
        // BaseSort sort = new BubbleSort(data);
        BaseSort sort = new RadixSort(data);
        sort.sort();
        sort.dispaly();
    }

}

以上代碼僅僅測試了其中的一種!
源碼下載地址[http://download.csdn.net/detail/u010154424/9483067](http://download.csdn.net/detail/u010154424/9483067

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章