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

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

从键盘输入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];
		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);
		
	}

}

这是产生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
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值