用Java实现几种常见的排序算法

package org.rut.util.algorithm;

/**
 * @author treeroot
 * @since 2006-2-2
 * @version 1.0
 */
public class SortUtil {
    public final static int INSERT = 1;
    public final static int BUBBLE = 2;
    public final static int SELECTION = 3;
    public final static int SHELL = 4;
    public final static int QUICK = 5;
    public final static int IMPROVED_QUICK = 6;
    public final static int MERGE = 7;
    public final static int IMPROVED_MERGE = 8;
    public final static int HEAP = 9;

    public static void sort(int[] data) {
        sort(data, IMPROVED_QUICK);
    }

    private static String[] name = { "insert", "bubble", "selection", "shell",
            "quick", "improved_quick", "merge", "improved_merge", "heap" };

    private static Sort[] impl = new Sort[] { new InsertSort(),
            new BubbleSort(), new SelectionSort(), new ShellSort(),
            new QuickSort(), new ImprovedQuickSort(), new MergeSort(),
            new ImprovedMergeSort(), new HeapSort() };

    public static String toString(int algorithm) {
        return name[algorithm - 1];
    }

    public static void sort(int[] data, int algorithm) {
        impl[algorithm - 1].sort(data);
    }

    public static interface Sort {
        public void sort(int[] data);
    }

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

// 插入排序:
class InsertSort implements SortUtil.Sort {
    public void sort(int[] data) {
        for (int i = 1; i < data.length; i++) {
            for (int j = i; (j > 0) && (data[j] < data[j - 1]); j--) {
                SortUtil.swap(data, j, j - 1);
            }
        }
    }
}

// 冒泡排序:
class BubbleSort implements SortUtil.Sort {
    public void sort(int[] data) {
        for (int i = 0; i < data.length; i++) {
            for (int j = data.length - 1; j > i; j--) {
                if (data[j] < data[j - 1]) {
                    SortUtil.swap(data, j, j - 1);
                }
            }
        }
    }
}

// 选择排序:
class SelectionSort implements SortUtil.Sort {
    public void sort(int[] data) {
        for (int i = 0; i < data.length; i++) {
            int lowIndex = i;
            for (int j = data.length - 1; j > i; j--) {
                if (data[j] < data[lowIndex]) {
                    lowIndex = j;
                }
            }
            SortUtil.swap(data, i, lowIndex);
        }
    }
}

// Shell排序:
class ShellSort implements SortUtil.Sort {
    public void sort(int[] data) {
        for (int i = data.length / 2; i > 2; i /= 2) {
            for (int j = 0; j < i; j++) {
                insertSort(data, j, i);
            }
        }
        insertSort(data, 0, 1);
    }

    private void insertSort(int[] data, int start, int inc) {
        for (int i = start + inc; i < data.length; i += inc) {
            for (int j = i; (j >= inc) && (data[j] < data[j - inc]); j -= inc) {
                SortUtil.swap(data, j, j - inc);
            }
        }
    }
}

// 快速排序
class QuickSort implements SortUtil.Sort {
    public void sort(int[] data) {
        quickSort(data, 0, data.length - 1);
    }

    private void quickSort(int[] data, int i, int j) {
        int pivotIndex = (i + j) / 2;
        // swap
        SortUtil.swap(data, pivotIndex, j);

        int k = partition(data, i - 1, j, data[j]);
        SortUtil.swap(data, k, j);
        if ((k - i) > 1){
            quickSort(data, i, k - 1);
        }
        
        if ((j - k) > 1){
            quickSort(data, k + 1, j);
        }
    }

    private int partition(int[] data, int l, int r, int pivot) {
        do {
            while (data[++l] < pivot){
                ;
            }
            
            while ((r != 0) && data[--r] > pivot){
                ;
            }
            
            SortUtil.swap(data, l, r);
        } while (l < r);
        SortUtil.swap(data, l, r);
        return l;
    }
}

// 改进后的快速排序:
class ImprovedQuickSort implements SortUtil.Sort {
    private static int MAX_STACK_SIZE = 4096;
    private static int THRESHOLD = 10;

    public void sort(int[] data) {
        int[] stack = new int[MAX_STACK_SIZE];

        int top = -1;
        int pivot;
        int pivotIndex, l, r;

        stack[++top] = 0;
        stack[++top] = data.length - 1;

        while (top > 0) {
            int j = stack[top--];
            int i = stack[top--];

            pivotIndex = (i + j) / 2;
            pivot = data[pivotIndex];

            SortUtil.swap(data, pivotIndex, j);

            l = i - 1;
            r = j;
            do {
                while (data[++l] < pivot){
                    ;
                }
                
                while ((r != 0) && (data[--r] > pivot)){
                    ;
                }
                
                SortUtil.swap(data, l, r);
            } while (l < r);
            
            SortUtil.swap(data, l, r);
            SortUtil.swap(data, l, j);

            if ((l - i) > THRESHOLD) {
                stack[++top] = i;
                stack[++top] = l - 1;
            }
            
            if ((j - l) > THRESHOLD) {
                stack[++top] = l + 1;
                stack[++top] = j;
            }

        }
        insertSort(data);
    }

    private void insertSort(int[] data) {
        for (int i = 1; i < data.length; i++) {
            for (int j = i; (j > 0) && (data[j] < data[j - 1]); j--) {
                SortUtil.swap(data, j, j - 1);
            }
        }
    }
}

// 归并排序:
class MergeSort implements SortUtil.Sort {
    public void sort(int[] data) {
        int[] temp = new int[data.length];
        mergeSort(data, temp, 0, data.length - 1);
    }

    private void mergeSort(int[] data, int[] temp, int l, int r) {
        int mid = (l + r) / 2;
        if (l == r) {
            return;
        }

        mergeSort(data, temp, l, mid);
        mergeSort(data, temp, mid + 1, r);
        for (int i = l; i <= r; i++) {
            temp[i] = data[i];
        }
        int i1 = l;
        int i2 = mid + 1;
        for (int cur = l; cur <= r; cur++) {
            if (i1 == mid + 1) {
                data[cur] = temp[i2++];
            } else if (i2 > r) {
                data[cur] = temp[i1++];
            } else if (temp[i1] < temp[i2]) {
                data[cur] = temp[i1++];
            } else {
                data[cur] = temp[i2++];
            }
        }
    }
}

// 改进后的归并排序:
class ImprovedMergeSort implements SortUtil.Sort {
    private static final int THRESHOLD = 10;

    public void sort(int[] data) {
        int[] temp = new int[data.length];
        mergeSort(data, temp, 0, data.length - 1);
    }

    private void mergeSort(int[] data, int[] temp, int l, int r) {
        int i, j, k;
        int mid = (l + r) / 2;
        if (l == r) {
            return;
        }

        if ((mid - l) >= THRESHOLD) {
            mergeSort(data, temp, l, mid);
        } else {
            insertSort(data, l, mid - l + 1);
        }

        if ((r - mid) > THRESHOLD) {
            mergeSort(data, temp, mid + 1, r);
        } else {
            insertSort(data, mid + 1, r - mid);
        }

        for (i = l; i <= mid; i++) {
            temp[i] = data[i];
        }
        for (j = 1; j <= r - mid; j++) {
            temp[r - j + 1] = data[j + mid];
        }

        int a = temp[l];
        int b = temp[r];
        for (i = l, j = r, k = l; k <= r; k++) {
            if (a < b) {
                data[k] = temp[i++];
                a = temp[i];
            } else {
                data[k] = temp[j--];
                b = temp[j];
            }
        }
    }

    private void insertSort(int[] data, int start, int len) {
        for (int i = start + 1; i < start + len; i++) {
            for (int j = i; (j > start) && data[j] < data[j - 1]; j--) {
                SortUtil.swap(data, j, j - 1);
            }
        }
    }
}

// 堆排序:
class HeapSort implements SortUtil.Sort {

    public void sort(int[] data) {
        MaxHeap h = new MaxHeap();
        h.init(data);
        for (int i = 0; i < data.length; i++) {
            h.remove();
        }
        System.arraycopy(h.queue, 1, data, 0, data.length);
    }

    private static class MaxHeap {
        private int size = 0;
        private int[] queue;

        public void init(int[] data) {
            this.queue = new int[data.length + 1];
            for (int i = 0; i < data.length; i++) {
                queue[++size] = data[i];
                fixUp(size);
            }
        }

        public int get() {
            return queue[1];
        }

        public void remove() {
            SortUtil.swap(queue, 1, size--);
            fixDown(1);
        }

        private void fixDown(int k) {
            int j;
            while ((j = k << 1) <= size) {
                if (j < size && queue[j] < queue[j + 1]) {
                    j++;
                }
                if (queue[k] > queue[j]) {// 不用交换
                    break;
                }
                SortUtil.swap(queue, j, k);
                k = j;
            }
        }

        private void fixUp(int k) {
            while (k > 1) {
                int j = k >> 1;
                if (queue[j] > queue[k]) {
                    break;
                }
                SortUtil.swap(queue, j, k);
                k = j;
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值