您的位置:首页 > 编程语言 > Java开发

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

2013-12-18 11:42 666 查看
实现直接插入排序、希尔排序、快速排序、堆排序、归并排序算法;并且输出各种排序算法每一趟排序的结果;

从键盘输入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.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];
else
break;
}
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++];
else
tmpArray[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);

}

}

[b]这是产生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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐