常见排序算法(Java实现)

来源:互联网 发布:手机在线客服系统源码 编辑:程序博客网 时间:2024/06/03 19:38

常见排序算法实现。

import java.util.Arrays;/** *  * @ClassName: SortAlgorithms * * @Description: 常见的排序算法 java 实现 * void bubbleSort(T[]) 冒泡排序 * void insertSort(T[]) 插入排序 * void selectSort(T[]) 选择排序 * void shellSort(T[]) 希尔排序 * void mergeSort(T[]) 归并排序 * void quickSort(T[]) 快速排序 * void heapSort(T[]) 堆排序 * @author: ccding * @date: 2016年10月26日 上午10:50:55 * * @param <T> 待排序元素的类型 */public class SortAlgorithms <T extends Comparable<T>> {    public void bubbleSort(T[] nums){        T tmp;        for(int i=0; i<nums.length; i++){            for(int j=i+1; j<nums.length; j++){                if(nums[j].compareTo(nums[i]) < 0){                    tmp = nums[j];                    nums[j] = nums[i];                    nums[i] = tmp;                }            }        }    }    public void insertSort(T[] nums){        T tmp;        for(int i=1; i<nums.length; i++){            tmp = nums[i];            int j = i-1;            while(j>=0 && tmp.compareTo(nums[j]) < 0){                nums[j+1] = nums[j];                j--;            }            nums[j+1] = tmp;        }    }    public void selectSort(T[] nums){        T tmp;        int minIndex;        for(int i=0; i<nums.length; i++){            minIndex = this.getMinIndex(nums, i);            tmp = nums[minIndex];            nums[minIndex] = nums[i];            nums[i] = tmp;        }    }    private int getMinIndex(T[] nums, int startIndex){        T minValue = nums[startIndex];        int minIndex = startIndex;        for(int i=startIndex; i<nums.length; i++){            if(minValue.compareTo(nums[i]) > 0){                minValue = nums[i];                minIndex = i;            }        }        return minIndex;    }    public void shellSort(T[] nums){        int gap = nums.length >> 1;        T tmp;        while(gap >= 1){            for(int i=gap; i<nums.length; i++){                if(nums[i].compareTo(nums[i-gap]) < 0){                    tmp = nums[i];                    int j = i-gap;                    while( j>=0 && tmp.compareTo(nums[j])<0){                        nums[j+gap] = nums[j];                        j -= gap;                    }                    nums[j+gap] = tmp;                }            }            gap = gap >> 1;        }    }    public void mergeSort(T[] nums){        mergeSort(nums, 0, nums.length-1);    }    private void mergeSort(T[] nums, int startIndex, int endIndex){        if(endIndex > startIndex){            int midIndex = (endIndex+startIndex) >> 1;            mergeSort(nums, startIndex, midIndex);            mergeSort(nums, midIndex+1, endIndex);            merge(nums, startIndex, midIndex, endIndex);        }    }    private void merge(T[] nums, int s, int m, int e){        T[] sub1 = Arrays.copyOfRange(nums, s, m+1);        T[] sub2 = Arrays.copyOfRange(nums, m+1, e+1);        int idx1 = 0, idx2 = 0;        int k=s;        while(idx1<sub1.length && idx2<sub2.length){            if(sub1[idx1].compareTo(sub2[idx2]) < 0){                nums[k++] = sub1[idx1++];            }else{                nums[k++] = sub2[idx2++];            }        }        while(idx1<sub1.length){            nums[k++] = sub1[idx1++];        }        while(idx2<sub2.length){            nums[k++] = sub2[idx2++];        }    }    public void quickSort(T[] nums){        quickSort(nums, 0, nums.length-1);    }    private void quickSort(T[] nums, int s, int t){        if(s < t){            int mid = partition(nums, s, t);            quickSort(nums, s, mid-1);            quickSort(nums, mid+1, t);        }    }    private int partition(T[] nums, int s, int t){        int randomIdx = (int)((t-s) * Math.random())+s;        T e = nums[randomIdx];        exchange(nums, randomIdx, t);        while(s < t){            while(s<t && nums[s].compareTo(e) <= 0)                s++;            nums[t] = nums[s];            while(s<t && nums[t].compareTo(e) >= 0)                t--;            nums[s] = nums[t];        }        nums[s] = e;        return s;    }    public void heapSort(T[] nums){        buildMinHeap(nums);        int heapSize = nums.length;        for(int i=nums.length-1; i>=0; i--){            exchange(nums, i, 0);            heapify(nums, 0, --heapSize);        }    }    private void buildMinHeap(T[] nums){        for(int i= nums.length>>1; i>=0; i--){            heapify(nums, i, nums.length);        }    }    private void heapify(T[] nums, int i, int heapSize){        int l = i<<1;        int r = l+1;        int large = i;        if(l<heapSize && nums[l].compareTo(nums[large])<0){            large = l;        }        if(r<heapSize && nums[r].compareTo(nums[large])<0){            large = r;        }        if(large != i){            exchange(nums, large, i);            heapify(nums, large, heapSize);        }    }    private void exchange(T[] nums, int i, int j){        T tmp = nums[i];        nums[i] = nums[j];        nums[j] = tmp;    }}