利用JAVA实现数据结构中常用的插入排序和快速排序算法.docx
- 文档编号:3741190
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:19
- 大小:19.73KB
利用JAVA实现数据结构中常用的插入排序和快速排序算法.docx
《利用JAVA实现数据结构中常用的插入排序和快速排序算法.docx》由会员分享,可在线阅读,更多相关《利用JAVA实现数据结构中常用的插入排序和快速排序算法.docx(19页珍藏版)》请在冰豆网上搜索。
利用JAVA实现数据结构中常用的插入排序和快速排序算法
利用java实现数据结构中常用的插入排序和快速排序算法
在网上看的,挺全的,收了先。
。
第十章排序
源程序:
Data.java
packageSort;
classData{
Comparablekey;
Objectvalue;
publicData(){
}
publicData(Datadata){
this.key=data.key;
this.value=data.value;
}
publicData(Comparablekey,Objectvalue){
this.key=key;
this.value=value;
}
publicStringtoString(){
return"key="+key+";"+"value="+value+";"+"\n";
}
}
Insertion.java
packageSort;
publicclassInsertionSort{
publicInsertionSort(){
}
//直接插入排序,从下标1开始
publicstaticvoidstraightInsertionSort(Data[]data){
inti,j;
for(i=2;i if(data[i]pareTo(data[i-1].key)<0){ data[0]=data[i];//复制为监视哨 for(j=i-1;data[0]pareTo(data[j].key)<0;--j){ data[j+1]=data[j];//记录右移 } data[j+1]=data[0];//插入 } } } //折半插入排序,从下标1开始 publicstaticvoidBinaryInsertionSort(Data[]data){ inti,j,low,high,mid; for(i=2;i if(data[i]pareTo(data[i-1].key)<0){ data[0]=data[i]; //找插入位置 low=1;high=i-1; while(low<=high){ mid=(low+high)/2; if(data[0]pareTo(data[mid].key)<0)high=mid-1; elselow=mid+1; } //移动插入位置以后的元素 for(j=i-1;j>=high+1;j--){ data[j+1]=data[j]; } data[high+1]=data[0];//插入 } } } //表插入排序 publicstaticvoidListInsertionSort(Data[]data){ inti,j,k; //innerclass: Table classTable{ Comparablekey; intnext; } Table[]table=newTable[data.length]; for(i=1;i table[i]=newTable(); table[i].key=data[i].key; } table[0]=newTable(); table[0].key=newInteger(Integer.MAX_VALUE); table[0].next=1; table[1].next=0; for(i=2;i for(j=0,k=table[0].next;table[k]pareTo(table[i].key)<=0;j=k,k=table[k].next); table[j].next=i; table[i].next=k; } Data[]newData=newData[data.length]; intposition=table[0].next; for(i=1;i newData[i]=data[position]; position=table[position].next; } //data=newData;//不知为什么不能把newData赋给data,而必须用下面的 for(i=1;i data[i]=newData[i]; } } } QuickSort.java packageSort; importQueue.*; publicclassQuickSort{ publicQuickSort(){ } //起泡排序 publicstaticvoidBubbleSort(Data[]data){ inti,j,lastChangeIndex; Datatemp; i=data.length-1; while(i>1){ lastChangeIndex=1; for(j=1;j if(data[j+1]pareTo(data[j].key)<0){ temp=data[j+1]; data[j+1]=data[j]; data[j]=temp; lastChangeIndex=j; } } i=lastChangeIndex; } } //快速排序 publicstaticvoidQuickSort(Data[]data){ QSort(data,1,data.length-1); } publicstaticvoidOptimizeQuickSort(Data[]data){ OQSort(data,1,data.length-1); } privatestaticvoidQSort(Data[]data,ints,intt){ intpivotLoc; if(s pivotLoc=Partition(data,s,t);//对data[1...data.length-1]进行一次划分 QSort(data,s,pivotLoc-1);//对低子序列进行递归排序 QSort(data,pivotLoc+1,t);//对高子序列进行递归排序 } } privatestaticvoidOQSort(Data[]data,ints,intt){ intpivotLoc; if(s pivotLoc=RandomPartition(data,s,t); QSort(data,s,pivotLoc-1);//对低子序列进行递归排序 QSort(data,pivotLoc+1,t);//对高子序列进行递归排序 } } privatestaticintRandomPartition(Data[]data,intlow,inthigh){ //i是low inti=(int)Math.random()*(high-low)+low; Datatemp=data[low]; data[low]=data[i]; data[i]=temp; returnPartition(data,low,high); } privatestaticintPartition(Data[]data,intlow,inthigh){ ComparablepivotKey; data[0]=data[low]; pivotKey=data[low].key;//枢轴 while(low while(low high--; } data[low]=data[high]; while(low low++; } data[high]=data[low]; } data[low]=data[0]; returnlow; } //堆排序 publicstaticvoidHeapSort(Data[]data){ //先对顺序表进行堆排序,建立大顶堆 inti; Datatemp; for(i=(data.length-1)/2;i>0;i--){ HeapAdjust(data,i,data.length-1); }//建立大顶堆 for(i=(data.length-1);i>1;i--){ temp=data[1]; data[1]=data[i]; data[i]=temp; HeapAdjust(data,1,i-1); } } privatestaticvoidHeapAdjust(Data[]data,intstart,intend){ intj; Datatemp; temp=data[start]; for(j=2*start;j<=end;j*=2){ if(j j++; } if(pareTo(data[j].key)>=0){ break; } data[start]=data[j]; start=j; } data[start]=temp; } //简单选择排序 publicstaticvoidSimpleSelectSort(Data[]data){ inti,j; Datatemp; for(i=1;i j=MinKey(data,i); if(j! =i){ temp=data[i]; data[i]=data[j]; data[j]=temp; } } } privatestaticintMinKey(Data[]data,intstart){ inti,j=start; Comparabletemp; temp=data[start].key; if(data.length-start==0){ returnstart; } for(i=start+1;i if(pareTo(data[i].key)>0){ temp=data[i].key; j=i; } } returnj; } //归并排序 privatestaticData[]originalnewData2; privatestaticData[]newData2; publicstaticvoidMergingSort(Data[]data){ originalnewData2=newData[data.length]; newData2=newData[data.length]; for(inti=1;i originalnewData2[i]=newData(); newData2[i]=newData(); } MSort(data,data,1,data.length-1); } privatestaticvoidMSort(Data[]originalData,Data[]data,intstart, intend){ if(start==end){ data[start]=originalData[start]; } else{ intmid=(start+end)/2; MSort(originalData,newData2,start,mid); MSort(originalData,newData2,mid+1,end); //怎样才能像值传递一样使用引用传递,即不改变它的值 for(intk=start;k<=end;k++)originalnewData2[k]=newData(newData2[k]); merge(originalnewData2,data,start,mid,end);//这里的data好像不再是一开始传入的data,而是递归时的newData2 } } privatestaticvoidmerge(Data[]newData,Data[]data,intstart,intmid, intend){ inti,j; intk=start; for(i=start,j=mid+1;start<=mid&&j<=end;i++){ if(newData[start]pareTo(newData[j].key)<=0){ data[i]=newData[start++]; } else{ data[i]=newData[j++]; } } if(start<=mid){ for(inttempI=start;tempI<=mid;tempI++){ data[i++]=newData[tempI]; } } if(j<=end){ for(inttempJ=j;tempJ<=end;tempJ++){ data[i++]=newData[tempJ]; } } } //基数排序 publicstaticvoidRadixSort(Data[]data,intdigits){ intd,j,k,factor=1; QueueInterface[]queues=newLinkQueue[10]; for(inti=0;i<10;i++){ queues[i]=newLinkQueue(); } for(d=1;d<=digits;factor*=10,d++){ //distribution for(j=1;j queues[(((Integer)data[j].key).intValue()/factor)%10].put(newData(data[j])); } //collection for(j=0,k=1;j<10;j++){ while(! queues[j].isEmpty()){ data[k++]=(Data)queues[j].removeHead(); } } } } } 测试类: packageSort; publicclassTest{ publicTest(){ } //产生测试数据 publicstaticData[]getData(intsize){ Data[]data=newData[size+1]; intnumber; for(inti=0;i number=(int)(Math.random()*size*10); data[i]=newData(newInteger(number),newInteger(number)); } returndata; } //复制测试数据 publicstaticData[]duplicationData(Data[]data){ Data[]duplication=newData[data.length]; for(inti=1;i duplication[i]=newData(data[i]); } returnduplication; } publicstaticvoidprintData(Data[]data){ for(inti=1;i System.out.print(data[i].toString()); } publicstaticvoidmain(String[]args){ longstartTime,stopTime,sortingTime; Data[]data=getData(6000); Data[]data1,data2,data3,data4,data5,data6,data7,data8,data9,data10; data1=duplicationData(data); data2=duplicationData(data); data3=duplicationData(data); data4=duplicationData(data); data5=duplicationData(data); data6=duplicationData(data); data7=duplicationData(data); data8=duplicationData(data); data9=duplicationData(data); data10=duplicationData(data); startTime=System.currentTimeMillis(); Sort.InsertionSort.straightInsertionSort(data1); stopTime=System.currentTimeMillis(); sortingTime=stopTime-startTime; System.out.println("StraightInsertionSorttimeis"+sortingTime); //System.out.println("StraightInsertionSortAnswer"); //printData(data1); startTime=System.currentTimeMillis(); Sort.InsertionSort.BinaryInsertionSort(data2); stopTime=System.currentTimeMillis(); sortingTime=stopTime-startTime; System.out.println("BinaryInsertionSorttimeis"+sortingTime); //System.out.println("BinaryInsertionSortAnswer"); //printData(data2); startTime=System.currentTimeMillis(); Sort.InsertionSort.ListInsertionSort(data3); stopTime=System.currentTimeMillis(); sortingTime=stopTime-startTime; System.out.println("ListInsertionSorttimeis"+sortingTime); //System.out.println("ListInsertionSortAnswer"); //printData(data3); startTime=System.currentTimeMillis(); Sort.QuickSort.BubbleSort(data4); stopTime=System.currentTimeMillis(); sortingTime=stopTime-startTime; System.out.println("BubbleSorttimeis"+sor
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 利用 JAVA 实现 数据结构 常用 插入 排序 快速 算法