• 排序算法的java实现


    冒泡、选择就不写了。很常见

    一:插入排序:

    /**
     * 插入排序
     */
    public class P4_3 {
        static void insertSort(int[] a){
            int j,t;
            /**
             *
             */
            for (int i = 0; i < a.length; i++) {
                t=a[i];
                j=i-1;
                while (j>=0&&t<a[j]){
                    a[j+1]=a[j];
                    j--;
                }
                a[j+1]=t;
            }
    
        }
        public static void main(String[] args){
            int[] a=new int[]{3,4,2,6,2,5,1,9,28};
            insertSort(a);
            for (int i = 0; i < a.length; i++) {
                System.out.println(a[i]);
            }
    
        }
    }

    二:shell排序

    /**
     * shell sort
     */
    public class P4_4 {
        static void shellsort(int[] a){
            for (int r = a.length/2; r >=1 ; r/=2) {
                for (int i = r; i < a.length; i++) {
                    int t=a[i];
                    int j=i-r;
                    while (j>=0&&t<a[j]){
                        a[j+r]=a[j];
                        j=j-r;
                    }
                    a[j+r]=t;
                }
            }
        }
        public static void main(String[] args){
            int[] a=new int[]{3,4,2,6,25,1,9,28};
            shellsort(a);
            for (int i = 0; i < a.length; i++) {
                System.out.println(a[i]);
            }
        }
    }

    三:快排

    /**
     * qicksort
     */
    public class P4_5 {
        static void qicksort(int[] a,int left,int right){
            int f,t;
            int rtemp,ltemp;
            rtemp=right;
            ltemp=left;
            f=a[(right+left)/2];
            while (ltemp<rtemp){
                while (a[ltemp]<f){
                    ltemp++;
                }
                while (a[rtemp]>f){
                    rtemp--;
                }
                if (ltemp<rtemp){
                    //将左边大于分界值得数交换到邮编小于分界值得位置
                    t=a[rtemp];
                    a[rtemp]=a[ltemp];
                    a[ltemp]=t;
                    ltemp++;
                    rtemp--;
                }
            }
            if (ltemp==rtemp){
                ltemp++;
            }
            if (right>ltemp){
                qicksort(a,rtemp+1,right);
            }
            if (rtemp>left){
                qicksort(a,left,ltemp-1);
            }
        }
        public static void main(String[] args){
            int[] a=new int[]{3,4,2,6,25,1,9,73};
            qicksort(a,0,a.length-1);
            for (int i = 0; i < a.length; i++) {
                System.out.println(a[i]);
            }
    
        }
    }

    四:堆排序

    /**
     * heapsort
     */
    public class P4_6 {
        static void heapsort(int[] a,int n){
            int i,j,h,k;
            int t;
            //构建堆
            for (i = n/2-1; i >=0 ; i--) {//找到当前最后一个节点的父节点
                //存在右子树
                while (2*i+1<n){
                    j=2*i+1;
                    if (j+1<n){
                        if (a[j]<a[j+1]){
                            j++;
                        }
                    }
                    //将最大的放在节点位置
                    if (a[i]<a[j]){
                        t=a[i];
                        a[i]=a[j];
                        a[j]=t;
                        i=j;
                    }else {
                        break;
                    }
                }
            }
            //输出堆:
            System.out.println("输出的堆:");
            for (int l = 0; l < a.length; l++) {
                System.out.print(a[l]);
                System.out.print(" ");
                System.out.println();
            }
    
            //找出最大
            for (i = n-1; i >=0 ; i--) {
                //将找到的数据放在最右边
                t=a[0];
                a[0]=a[i];
                a[i]=t;
                k=0;
                //k存在有子树
                while ((2*k+1)<i){
                    j=2*k+1;
                    if((j+1)<i){
                        if (a[j]<a[j+1]){
                            j++;
                        }
                    }
                    if (a[k]<a[j]){
                        t=a[k];
                        a[k]=a[j];
                        a[j]=t;
                        k=j;
                    }else {
                        break;
                    }
                }
    
    
            }
    
        }
        public static void main(String[] args){
            int[] a=new int[]{1,3,5,7,9,2,4,6,8,0};
            heapsort(a,a.length);
            for (int l = 0; l < a.length; l++) {
                System.out.print(a[l]);
                System.out.print(" ");
            }
        }
    }

    五:归并排序

    /**
     * mergesort
     */
    public class P4_7 {
        static void mergeone(int[] a,int[] b,int n,int len){
            int i,j,k,s,e;
            s=0;//开始位置
            while ((s+len)<n){
                //结束位置
                e=s+2*len-1;
                if (e>n){
                    e=n-1;
                }
                //合并
                k=s;
                i=s;
                j=s+len;
                while (i<(s+len)&&j<=e){
                    if (a[i]<a[j]){
                        b[k++]=a[i++];
                    }else {
                        b[k++]=a[j++];
                    }
                }
                //将未合并的数组复制
                while (i<(s+len)){
                    b[k++]=a[i++];
                }
                while (j<=e){
                    b[k++]=a[j++];
                }
                s=e+1;//下一次开始的位置
    
            }
            //没有比较的合并过来
            if (s<n){
                for (;s<n;s++){
                    b[s]=a[s];
                }
            }
        }
        static void mergesort(int[] a,int n){
            int[] p=new int[n];
            int f,len;
            len=1;
            f=0;
            while (len<n){
                if (f==1){
                    mergeone(p,a,n,len);
                }else {
                    mergeone(a,p,n,len);
                }
                len=2*len;
                f=1-f;
            }
            if (f==1){
                for (int h = 0; h < n; h++) {
                    a[h]=p[h];
                }
            }
        }
        public static void main(String[] args){
            int[] a=new int[]{3,4,2,6,25,1,9,92,19};
            mergesort(a,a.length);
            for (int i = 0; i < a.length; i++) {
                System.out.println(a[i]);
            }
        }
    }
  • 相关阅读:
    BZOJ 2157: 旅游 (2017.7.21 6:30-2017.7.21 15:38 今日第一题。。)
    洛谷 P1021 邮票面值设计
    洛谷 P2912 [USACO08OCT]牧场散步Pasture Walking
    COGS 2111. [NOIP2015普及]扫雷游戏
    洛谷 P3038 [USACO11DEC]牧草种植Grass Planting
    COGS 1439. [NOIP2013]货车运输
    COGS 908. 校园网
    codevs 1422 河城荷取
    codevs 1183 泥泞的道路
    洛谷 P3390 【模板】矩阵快速幂
  • 原文地址:https://www.cnblogs.com/guhao123/p/4137906.html
Copyright © 2020-2023  润新知