希尔排序与堆排序(Java版)

来源:互联网 发布:网络解锁nck 编辑:程序博客网 时间:2024/05/01 16:48

希尔排序


package ShellSort;import Utils.SortUtils;public class Demo {    public static void shellSort(int[] a){        int temp,j;        int increment = a.length;        do{            increment = increment/3+1;//如果是直接插入排序,这里的increment都为1。            //System.out.println(increment);            for (int i = increment; i < a.length; i++) {                if(a[i]<a[i-increment]){                    temp = a[i];//暂存于temp中                    for (j=i-increment; j>=0 && a[j]>temp; j-=increment) {                        a[j+increment] = a[j];//记录后移,查找插入位置                    }                    a[j+increment] = temp;//插入                }            }        }while(increment>1);        }    public static void main(String[] args) {        int[] a = {2,3,5,4,1,6,9,8,7};        shellSort(a);        SortUtils.printString(a);    }}

复杂度分析


堆排序

package HeapSort;import Utils.SortUtils;public class Demo02 {    //堆排序    public static void heapSort(int[] a){        int len = a.length;        //将待排序数据构建为大顶堆        for(int i=(a.length-1-1)/2;i>=0;i--){            heapAdjust(a,i,len);        }        for (int i = a.length-1; i > 0; i--){            //将队顶值与当前未经排序子序列的最后一个值交换            SortUtils.swap(a,0,i);            heapAdjust(a,0,--len);//重新调整大顶堆        }    }    //将待排序序列构建成一个大顶堆    public static void heapAdjust(int[] a,int s,int len){        int temp;        temp = a[s];        for (int i = 2*s+1; i < len; i++) {            if(i<len-1 && a[i]<a[i+1]){                i++;//i为关键字中较大的记录的下标            }            if(temp>=a[i]){//如果父节点本身就大于最大的子节点,终止循环                break;            }            a[s] = a[i];            s = i;        }        a[s] = temp;    }    public static void main(String[] args) {        int[] a = {2,3,5,4,1,6,9,8,7};        heapSort(a);        SortUtils.printString(a);    }}

复杂度分析


0 0