java五种内部排序(直接插入排序、希尔排序、快速排序、堆排序、归并排序)

来源:互联网 发布:英格兰长弓手—指算法 编辑:程序博客网 时间:2024/04/30 15:32

实现直接插入排序、希尔排序、快速排序、堆排序、归并排序算法;并且输出各种排序算法每一趟排序的结果;

从键盘输入8个整数{ 12 , 45 , 21 , 12 , 30 , 2 , 68 , 33 },存放在数组quick[8]中,调用各种排序算法,观察每一趟排序结果次序的变化;

package Sort;import java.util.Scanner;public class AllSort <AnyType>{static int cas=1;public static<AnyType extends Comparable<?super AnyType>>void InsertionSort(AnyType []a){int i,j;for(i=1;i<a.length;i++){AnyType tmp=a[i];for(j=i;j>0&&tmp.compareTo((AnyType)a[j-1])<0;j--)a[j]=a[j-1];a[j]=tmp;System.out.println("直接插入排序的第"+i+"趟排序是:");for(j=0;j<a.length;j++)System.out.print(a[j]+" ");System.out.println();}}public static<AnyType extends Comparable<?super AnyType>>void InsertionSort(AnyType []a,int left,int right){int i,j;for(i=left+1;i<=right;i++){AnyType tmp=a[i];for(j=i;j>left&&tmp.compareTo((AnyType)a[j-1])<0;j--)a[j]=a[j-1];a[j]=tmp;}}public static<AnyType extends Comparable<?super AnyType>>void ShellInsert(AnyType[] a,int gap){int j;for(int i=gap;i<a.length;i++){AnyType tmp=(AnyType)a[i];for(j=i;j>=gap&&tmp.compareTo((AnyType)a[j-gap])<0;j-=gap)a[j]=a[j-gap];a[j]=tmp;}System.out.println("希尔排序的第"+cas+"趟排序是:");for(j=0;j<a.length;j++)System.out.print(a[j]+" ");System.out.println();cas++;}public static <Anytype extends Comparable<? super Anytype>>void SwapReferences(Anytype[]a,int b,int c){Anytype temp=null;if(a[b].compareTo(a[c])>0){temp=a[b];a[b]=a[c];a[c]=temp;}}public <Anytype extends Comparable<? super Anytype>>Anytype median(Anytype[] a,int left,int right){int center=(left+right)/2;if(a[center].compareTo(a[left])<0)SwapReferences(a,left,center);if(a[right].compareTo(a[left])<0)SwapReferences(a,left,right);if(a[right].compareTo(a[center])<0)SwapReferences(a,center,right);SwapReferences(a,center,right);return a[right];}public <Anytype extends Comparable<? super Anytype>>void quicksort(Anytype[]a,int left,int right){if(right-left>2){Anytype pivot=median(a,left,right);int i=left,j=right;for(;;){//若已有序,会越界while(a[++i].compareTo(pivot)<0){}while(i<j&&a[--j].compareTo(pivot)>0){}if(i<j)SwapReferences(a,i,j);else break;}SwapReferences(a,i,right);quicksort(a,left,i-1);quicksort(a,i+1,right);}else InsertionSort(a,left,right);System.out.println("快排的第"+cas+"趟是:");for(int i=0;i<a.length;i++)System.out.print(a[i]+" ");System.out.println();cas++;}private static int leftChild(int i){return 2*i+1;}public static<AnyType extends Comparable<?super AnyType>>void percDown(AnyType[]a,int i,int n){int child;AnyType tmp;for(tmp=a[i];leftChild(i)<n;i=child){child=leftChild(i);if(child!=n-1&&a[child].compareTo(a[child+1])<0)child++;if(tmp.compareTo(a[child])<0)a[i]=a[child];elsebreak;}a[i]=tmp;}public static<AnyType extends Comparable<?super AnyType>>void HeapSort(AnyType[] a){for(int i=a.length/2;i>=0;i--)percDown(a,i,a.length);for(int i=a.length-1;i>0;i--){SwapReferences(a,0,i);percDown(a,0,i);System.out.println("堆排序第"+cas+"趟是:");for(int j=0;j<a.length;j++)System.out.print(a[j]+" ");System.out.println();cas++;}}public static<AnyType extends Comparable<?super AnyType>>void Merge(AnyType[] a,AnyType[]tmpArray,int leftPos,int rightPos,int rightEnd){int leftEnd=rightPos-1;int tmpPos=leftPos;int numElements=rightEnd-leftPos+1;while(leftPos<=leftEnd&&rightPos<=rightEnd){if(a[leftPos].compareTo(a[rightPos])<=0)tmpArray[tmpPos++]=a[leftPos++];elsetmpArray[tmpPos++]=a[rightPos++];}while(leftPos<=leftEnd)tmpArray[tmpPos++]=a[leftPos++];while(rightPos<=rightEnd)tmpArray[tmpPos++]=a[rightPos++];for(int i=0;i<numElements;i++,rightEnd--)a[rightEnd]=tmpArray[rightEnd];System.out.println("归并排序第"+cas+"趟是:");for(int i=0;i<a.length;i++)System.out.print(a[i]+" ");cas++;System.out.println();}public static<AnyType extends Comparable<?super AnyType>>void Msort(AnyType[]a,AnyType[]b,int left,int right){if(left==right)b[left]=a[left];if(left<right){int center=(left+right)/2;Msort(a,b,left,center);Msort(a,b,center+1,right);Merge(a,b,left,center+1,right);}}public static<AnyType extends Comparable<?super AnyType>>void MergeSort(AnyType []a){AnyType[] tmpArray=(AnyType[])new Comparable[a.length];Msort(a,tmpArray,0,a.length-1);}public static void main(String args[]){AllSort<Integer> allsort=new AllSort<Integer>();Scanner cin=new Scanner(System.in);Integer quick[]=new Integer[8];Integer quick1[]=new Integer[8];Integer quick2[]=new Integer[8];Integer quick3[]=new Integer[8];Integer quick4[]=new Integer[8];Integer quick5[]=new Integer[8];for(int i=0;i<8;i++){quick[i]=cin.nextInt();quick1[i]=quick[i];quick2[i]=quick[i];quick3[i]=quick[i];quick4[i]=quick[i];quick5[i]=quick[i];}System.out.println("直接插入排序:");allsort.InsertionSort(quick1);System.out.println("希尔排序:");Integer gap[]=new Integer[3];gap[0]=5;gap[1]=3;gap[2]=1;for(int k=0;k<3;k++)allsort.ShellInsert(quick2, gap[k]);System.out.println("快速排序:");cas=1;allsort.quicksort(quick3,0,7);System.out.println("堆排序:");cas=1;allsort.HeapSort(quick4);System.out.println("归并排序:");cas=1;allsort.MergeSort(quick5);}}

这是产生100个随机数的排序。

public static<AnyType extends Comparable<?super AnyType>> int RandomNum(){Random random=new Random();int n=random.nextInt(1000);return n;}

Integer s[]=new Integer[100];Integer s1[]=new Integer[100];Integer s2[]=new Integer[100];Integer s3[]=new Integer[100];Integer s4[]=new Integer[100];Integer s5[]=new Integer[100];for(int i=0;i<100;i++){s[i]=RandomNum();s1[i]=s2[i]=s3[i]=s4[i]=s5[i]=s[i];System.out.println(s[i]+" ");}System.out.println("直接插入排序:");allsort.InsertionSort(s1);System.out.println("希尔排序:");Integer gap1[]=new Integer[3];gap1[0]=5;gap1[1]=3;gap1[2]=1;for(int k=0;k<3;k++)allsort.ShellInsert(s2, gap1[k]);System.out.println("快速排序:");cas=1;allsort.quicksort(s3,0,99);System.out.println("堆排序:");cas=1;allsort.HeapSort(s4);System.out.println("归并排序:");cas=1;allsort.MergeSort(s5);




0 0
原创粉丝点击