java五种内部排序(直接插入排序、希尔排序、快速排序、堆排序、归并排序)
2013-12-18 11:42
666 查看
实现直接插入排序、希尔排序、快速排序、堆排序、归并排序算法;并且输出各种排序算法每一趟排序的结果;
从键盘输入8个整数{ 12 , 45 , 21 , 12 , 30 , 2 , 68 , 33 },存放在数组quick[8]中,调用各种排序算法,观察每一趟排序结果次序的变化;
[b]这是产生100个随机数的排序。
从键盘输入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);
相关文章推荐
- 牛客网Java刷题知识点之插入排序(直接插入排序和希尔排序)、选择排序(直接选择排序和堆排序)、冒泡排序、快速排序、归并排序和基数排序(博主推荐)
- 六、内部排序综合(九种)—插入类排序(直接插入、折半插入、希尔排序);交换类排序(冒泡、快速);选择类排序(简单选择、堆排序);二路归并排序;基数排序
- C++排序:冒泡排序,简单选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序
- python排序算法-冒泡排序,选择排序,直接插入排序,希尔排序,归并排序,快速排序,堆排序
- 数据结构6-排序算法(直接插入排序、希尔排序、快速排序、归并排序和堆排序)
- 排序算法: 冒泡排序, 快速排序,希尔排序,直接插入排序 ,直接选择排序,归并排序,堆排序
- 排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序
- java实现各种基础排序(冒泡排序、快速排序、直接选择排序、堆排序、直接插入排序、归并排序)
- 【Java】八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序 、快速排序、归并排序、堆排序和LST基数排序
- Java基础篇之----排序(快速排序、冒泡排序、堆排序、简单选择排序、 希尔排序、直接插入排序)
- 排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序
- 比较排序总结——直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序
- java实现七种排序 (插入排序, 希尔排序, 插入排序, 快速排序, 简单选择排序, 堆排序, 归并排序)
- 插入排序、冒泡排序、选择排序、希尔排序、快速排序、归并排序、堆排序和LST基数排序——JAVA实现
- 冒泡排序 快速排序 选择排序 堆排序 直接插入排序 希尔排序 归并排序
- 排序算法java 一 --快速排序、直接插入、希尔排序
- 6种排序算法及其比较 简单选择排序,堆排序,简单插入排序,希尔排序,冒泡排序,快速排序,归并排序
- java实现:快速排序,基数排序,计数排序,归并排序,堆排序,希尔排序
- 冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序java实现
- 数据结构_内部排序_希尔排序_快速排序_堆排序_归并排序_地址排序