`
lovnet
  • 浏览: 6713138 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

java算法:排序实现

 
阅读更多

java算法:排序实现

排序最基本规则:先比较,再对数据项进行排序。

例1:数据项接口

Java代码 复制代码
  1. interfaceItem{
  2. booleanless(Itemv);
  3. }

例2:排序方法类

Java代码 复制代码
  1. classSort{
  2. staticbooleanless(Itemv,Itemw){
  3. returnv.less(w);
  4. }
  5. staticvoidexch(Item[]a,inti,intj){
  6. Itemt=a[i];
  7. a[i]=a[j];
  8. a[j]=t;
  9. }
  10. staticvoidcomExch(Item[]a,inti,intj){
  11. if(less(a[j],a[i])){
  12. exch(a,i,j);
  13. }
  14. voidsort(Item[]a,intl,intr){
  15. example(a,l,r);
  16. }
  17. staticvoidexample(Item[]a,intl,intr){
  18. for(inti=l;i<r;i++){
  19. for(intj=i;j>l;j--){
  20. compExch(a,j-1,j);
  21. }
  22. }
  23. }
  24. }

数据项ADT的接口:数据项,或要排序的一般对象;数据项数组。

例3:数据项ADT接口

Java代码 复制代码
  1. classMyItemimplementsItem{
  2. publicbooleanless(Item)
  3. voidread()
  4. voidrand()
  5. pubicStringtoString()
  6. }

排序算法不仅对数据项,也对数据项数组起作用。

例4:可排序的数组ADT接口

Java代码 复制代码
  1. classSArray{
  2. SArray(int)
  3. voidrand()
  4. voidread()
  5. voidshow(int,int)
  6. voidsort(int,int)
  7. }

例5:可排序数组的排序驱动程序

Java代码 复制代码
  1. classArraySort{
  2. publicstaticvoidmain(String[]args){
  3. intN=100;
  4. SArraysa=newSArray(100);
  5. sa.rand();
  6. sa.sort(0,N-1);
  7. sa.show(0,N-1);
  8. }
  9. }

该程序表明:可以定义一个这样的计算而不需要涉及要排序的数据类型。

模块化的组织方式允许用别的实现来代替,这取决于该应用。如,当对大型数组测试排序时,可能会使用只输出部分数组的show的实现。

例6:可排序数组ADT的样本实现

Java代码 复制代码
  1. classMyArray{
  2. privateItem[]a;
  3. privateintN;
  4. MyArray(intN){
  5. this.N=N;
  6. a=newItem[N];
  7. for(inti=0;i<N;i++){
  8. a[i]=newItem();
  9. }
  10. }
  11. voidrand(){
  12. for(inti=0;i<N;i++){
  13. a[i].rand();
  14. }
  15. }
  16. voidread(){
  17. for(inti=0;i<N;i++){
  18. if(!In.empty()){
  19. a[i].read();
  20. }
  21. }
  22. }
  23. voidshow(intl,intr){
  24. for(inti=l;i<r;i++){
  25. System.out.println(a[i]+"");
  26. }
  27. }
  28. voidsort(intl,intr){
  29. Sort.sort(a,l,r);
  30. }
  31. }

对不同类型数据项进行排序的ADT实现。

例7:整数数据项的ADT实现

Java代码 复制代码
  1. classMyItemimplementsItem{
  2. privateintkey;
  3. publicbooleanless(Itemv){
  4. returnkey<((Item)v).key;
  5. }
  6. voidread(){
  7. key=In.getInt();
  8. }
  9. voidrand(){
  10. key=(int)(1000*Math.random());
  11. }
  12. publicStringtoString(){
  13. returnkey+"";
  14. }
  15. }

例8:样本记录类

Java代码 复制代码
  1. classRecord{
  2. intid;
  3. doublebalance;
  4. Stringwho;
  5. staticintSortKeyField=0;
  6. publicStringtoString(){
  7. returnid+""+balance+""+who;
  8. }
  9. }

例9:记录项的ADT实现

Java代码 复制代码
  1. classMyItemextendsRecordimplementsItem{
  2. publicbooleanless(Itemv){
  3. MyItemr=(MyItem)v;
  4. switch(SortKeyField){
  5. case2:returnwho.compareTo(r.who)<0;
  6. case1:returnbalance<r.balance;
  7. default:returnid<r.id;
  8. }
  9. }
  10. voidread(){
  11. id=In.getInt();
  12. balance=In.getDouble();
  13. who=In.getString();
  14. }
  15. }

上述方法在经典文献中被称为指针排序。

例10:字符串数据项的ADT实现

Java代码 复制代码
  1. classMyItemimplementsItem{
  2. Stringkey;
  3. publicboolean(Itemv){
  4. returnkey.compareTo(((MyItem)v).key)<0;
  5. }
  6. voidread(){
  7. key=In.getString();
  8. }
  9. voidrand(){
  10. inta=(int)('a');
  11. key="";
  12. for(inti=0;i<1+9*Math.random();i++){
  13. key+=(char)(a+26*Math.random();
  14. }
  15. }
  16. publicStringtoString(){
  17. returnkey;
  18. }
  19. }

说明了在java中对关键字使用String域直接实现String对象的MyItemADT。

java方法有很多好处。在排序情况下,使用引用避免对排序的数组直接进行操作。即时是只读文件,也能对它进行“排序”。而且,通过使用多重引用数组,能对一个数据体用两种不同的排序表示法来表示。这种不改变数据就能对数据进行操作的灵活性在许多应用中都十分有用的,同时,使用引用能节省移动整个记录的开销。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics