/* *@date:08-07-11 *@descript:几种常用排序的实现与应用 **/ import java.io.*; import java.util.Random; public class Sort { public Sort() { } // 冒泡排序 public void bubbleSort(int[] arry) { int len=arry.length; for(int i=1;i<len;i++) { for(int j=0;j<len-1;j++) { if(arry[j]>arry[j+1]) { int temp=arry[j]; arry[j]=arry[j+1]; arry[j+1]=temp; } } display(arry); } } //快速排序 public void quickSort(int[] arry,int low,int high) { int i=low; int j=high; int temp=arry[low]; while(i<j) { //在数组右边进行比较 while(i<j && temp<=arry[j]) { j--; } if(i<j) { arry[i]=arry[j]; i++; } //在数组左边进行比较 while(i<j && arry[i]<temp) { i++; } if(i<j) { arry[j]=arry[i]; j--; } arry[i]=temp; if(low<i) { quickSort(arry,low,i-1);//对左端的数据进行递归 } if(i<high) { quickSort(arry,j+1,high);//对右端的数据进行递归 } } display(arry); } //直接插入排序 public void insertSort(int[] arry) { for(int i=0;i<arry.length-1;i++) { int temp=arry[i+1]; int j=i; //arry[j]<temp则已有序,否则将temp插入到arry[j]前面 while(j>-1 && temp<=arry[j]) { arry[j+1]=arry[j]; j--; } arry[j+1]=temp; display(arry); } } //希尔排序 public void shellSort(int[] arry,int len) { int d=len/2; while(d>0) { for(int i=d;i<arry.length;i++) { int temp=arry[i]; int j=i-d; while(j>-1 && temp<=arry[j]) { arry[j+d]=arry[j]; j-=d; } arry[j+d]=temp; display(arry); } d=d/2; } } //直接选择排序 public void selectSort(int[] arry) { for(int i=0;i<arry.length-1;i++) { int small=i; for(int j=i+1;j<arry.length;j++) { if(arry[j]<arry[small]) { small=j; } } if(small!=i) { int temp=arry[small]; arry[small]=arry[i]; arry[i]=temp; } display(arry); } } //归并排序 public void mergerSort(int[] arry,int[] arryTemp,int left,int mid,int righ) { int i=left; int j=mid+1; int k=left; while((i<=mid)&&(j<=righ)) { if(arry[i]<arry[j]) { arryTemp[k++]=arry[i++]; }else { arryTemp[k++]=arry[j++]; } } while(i<=mid) { arryTemp[k++]=arry[i++]; } while(j<=righ) { arryTemp[k++]=arry[j++]; } //将数组arryTemp 中的数据复制到 arry 中 for (int t = left; t<=righ; t++) { arry[t]=arryTemp[t]; } } public void mSort(int[] arry,int left,int righ) { int [] arryTemp=new int[arry.length]; if(left<righ) { int mid=(left+righ)/2; mSort(arry,left,mid); mSort(arry,mid+1,righ); mergerSort(arry,arryTemp,left,mid,righ); } display(arry); } //输出数据元素 public void display(int[] arry) { for (int i = 0; i<arry.length; i++) { System.out.print(arry[i]+","); } System.out.println (); } //显示排序名称 public void display(String sortName) { System.out.println (sortName+":"); } //菜单界面 public void MenuShow(int[] arry) { String str=null; int []increment={3,1};//希尔排序的增量 try{ do { System.out.println ("/t"+"/t"+"/t"+"1 冒泡排序"); System.out.println ("/t"+"/t"+"/t"+"2 快速排序"); System.out.println ("/t"+"/t"+"/t"+"3 直接插入排序"); System.out.println ("/t"+"/t"+"/t"+"4 希尔排序"); System.out.println ("/t"+"/t"+"/t"+"5 选择排序"); System.out.println ("/t"+"/t"+"/t"+"6 归并排序"); System.out.println ("/t"+"/t"+"/t"+"请选择您要执行的排序方式:1-6"); BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); str=br.readLine(); int choice=new Integer(str); switch(choice) { case 1: //调用冒泡排序算法 display("冒泡排序"); bubbleSort(arry); break; case 2: //调用快速排序算法 display("快速排序"); quickSort(arry,0,arry.length-1); break; case 3: //调用直接插入排序算法 display("直接插入排序"); insertSort(arry); break; case 4: //调用希尔排序算法 display("希尔排序"); shellSort(arry,arry.length); break; case 5: //调用选择排序算法 display("选择排序"); selectSort(arry); break; case 6: //调用归并排序算法 display("归并排序"); mSort(arry,0,arry.length-1); break; default: System.out.println ("没有您要的选择! "); } System.out.println ("继续/退出? y/n"); str=br.readLine(); }while("y".equals(str)||"Y".equals(str)); } catch (Exception ex){ ex.printStackTrace(); } } public static void main(String[] args) { Random rand=new Random(); int []arryE=new int[500]; for(int i=0;i<500;i++) { arryE[i]=rand.nextInt(); } Sort sort=new Sort(); int[] arry={38,5,19,26,49,97,1,66}; sort.display("原始数据序列"); //如果要用上面的随机数进行排序,仅需将 arryE 数组作为参数传过去 sort.display(arry); sort.MenuShow(arry); } }
数据结构之排序
最新推荐文章于 2024-03-22 23:21:01 发布