排序算法的java实现

来源:互联网 发布:农村淘宝面试技巧 编辑:程序博客网 时间:2024/05/28 06:07

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

一:插入排序:

/** * 插入排序 */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]);    }  }}
0 0
原创粉丝点击