算法

如何只用一个大小为10的数组或列表来排序1000个随机整数?,但数组或列表之类的集合数据结构只可以用一个(大小为10的数组或列表).使用Java语言实现.

 

import java.io.*;
public class waibupaixu {
   
static int[] arr=new int[10];
   
final static int MAXCOUNT=1000;
   
public static void createRandomNumberFile() throws IOException {
        RandomAccessFile raf
= new RandomAccessFile("raw", "rw");
        FileOutputStream fos
= new FileOutputStream("source.txt");
        PrintStream ps
= new PrintStream(fos);
        PrintStream   old  
=   System.out; 
        System.setOut(ps);
       
int randomNum;
       
for (int i = 0; i < MAXCOUNT; i++) {
            randomNum
= (int) (Math.random() * 10000);
            raf.writeInt(randomNum);

            System.out.print(randomNum
+ "/t");
           
if ((i + 1) % 5 == 0) {
                System.out.println();
            }
        }
        System.setOut(old);
        ps.close();
        fos.close();
    }
   
    
public static void main(String[] args) throws IOException
    {
         RandomAccessFile rafa[]
= new RandomAccessFile[10];//外部文件 等待归并
         RandomAccessFile rafb = null;                        //外部文件 归并目标
         int min;                                            //等待归并的元素 定位
         int cnt_all=0;                                        //1000个计数
        
         createRandomNumberFile();
        
        
for (int i = 0; i < 100; i++) {
             readRandomNumberFile(
"raw",i*10,10);    //读10个
             sort_arr();                            //排序
             writeRandomNumberFile("raw10_"+i,0,10);    //写小文件
             Raw2Txt("raw10_"+i,"sort10_"+i+"+.txt",10);
         }
        
        
for (int i = 0; i < 10; i++) {
             rafb
=new RandomAccessFile("raw100_"+i, "rw");
            
//读入10个
             for (int j = 0; j < 10; j++) {
                 rafa[j]
=new RandomAccessFile("raw10_"+(10*i+j), "rw");
                 arr[j]
=rafa[j].readInt();
             }
            
//剩余90个
             for (int j = 0; j < 100; j++) {
                 min
=0;
                
for (int k = 0; k< 10; k++) {
                    
if(arr[k]!=-1)
                         min
=k;
                 }
                
//找到最小
                 for (int k = 0; k< 10; k++) {
                     System.out.print(
""+" || "+arr[k] );
                     System.out.println();
                    
                    
if(arr[k]<arr[min]&&arr[k]!=-1)
                         min
=k;
                 }
                
//保存
                 if(arr[min]!=-1){
                     rafb.writeInt(arr[min]);                    
                 }

                
                
//替补读入
                 System.out.println(""+" || "+j +" || "+min+" || "+arr[min]);
                
                
if( rafa[min].getFilePointer() < rafa[min].length()&& arr[min]!=-1)
                 {
                         arr[min]
=rafa[min].readInt();                    
                 }
                
else
                 {
                         arr[min]
=-1;                        
                 }
             }            
         }   
        
        
        
         rafb
=new RandomAccessFile("raw1000", "rw");
        
//读入10个
         for (int i = 0; i < 10; i++) {
             rafa[i]
=new RandomAccessFile("raw100_"+i, "rw");
             Raw2Txt(
"raw100_"+i,"sort100_"+i+".txt",100);            
             arr[i]
=rafa[i].readInt();
         }
        
//剩余990个
         for (int i = 0; i < 1000; i++) {
             min
=0;
            
for (int k = 0; k< 10; k++) {
                
if(arr[k]!=-1)
                     min
=k;
             }
            
//找到最小
             for (int k = 0; k< 10; k++) {
                 System.out.print(
""+" || "+arr[k] );
                 System.out.println();
                
                
if(arr[k]<arr[min]&&arr[k]!=-1)
                     min
=k;
             }
           
//保存
             cnt_all++;
             System.out.println(
""+" ||----------------------------------------> "+cnt_all );            
            
if(arr[min]!=-1){
                 rafb.writeInt(arr[min]);                    
             }
            
//替补读入
             System.out.println(""+" || "+i +" || "+min+" || "+arr[min]);
             System.out.println(
""+"++++++++++++++++++++++++++++++++++++++");            
            
if( rafa[min].getFilePointer() < rafa[min].length()  && arr[min]!=-1)
             {
                     arr[min]
=rafa[min].readInt();                    
             }
            
else
             {
                     arr[min]
=-1;                        
             }
         }   
        
         Raw2Txt(
"raw1000","sort1000.txt",1000);
    }
    
public static void sort_arr(  ){
            
int tmp;
           
for (int i = 0; i < 9; i++) {
               
for (int j = i+1; j < 10; j++) {
                   
if(arr[i] > arr[j])
                    {
                        tmp
=arr[i];
                        arr[i]
=arr[j];
                        arr[j]
=tmp;
                    }
                }               
            }
        }    
   
//从位置m,读入n个整数到arr数组   
    public static void readRandomNumberFile(String file,long m,long n) throws IOException
    {
        RandomAccessFile raf
= new RandomAccessFile(file, "rw");
        raf.seek(Integer.SIZE
/8*(m));
       
for (int i = 0; i < n; i++) {
            arr[i]
=raf.readInt();
        }
    }
   
//从位置m,将arr数组的n个整数写入文件      
    public static void writeRandomNumberFile(String file,long m,long n) throws IOException
    {
        RandomAccessFile raf
= new RandomAccessFile(file, "rw");
        raf.seek(Integer.SIZE
/8*(m));
       
for (int i = 0; i < n; i++) {
            raf.writeInt(arr[i]);
        }
    }
   
public static void Raw2Txt(String src,String dst,long n) throws IOException {
       
int tmp;
        RandomAccessFile raf
= new RandomAccessFile(src, "rw");
        FileOutputStream fos
= new FileOutputStream(dst);
        PrintStream ps
= new PrintStream(fos);
        System.out.println(
""+"file of int "+(raf.length()/4));
        PrintStream   old  
=   System.out; 
        System.setOut(ps);
       
for (int i = 0; i < n; i++) {
            tmp
=raf.readInt();
            System.out.print(tmp
+ "/t");
           
if ((i + 1) % 5 == 0) {
                System.out.println();
            }
        }
        System.setOut(old);
        ps.close();
        fos.close();
    }   
}

 

我粘贴一个带统计时间的:我的机器 amd 1.8G ,1G内存,150ms
另外,删除中间文件没有做到,高手指点一下,谢谢。

Java code
   
   
import java.io. * ; public class waibupaixu { static int [] arr = new int [ 10 ]; final static int MAXCOUNT = 1000 ; public static void createRandomNumberFile() throws IOException { RandomAccessFile raf = new RandomAccessFile( " raw " , " rw " ); FileOutputStream fos = new FileOutputStream( " source.txt " ); PrintStream ps = new PrintStream(fos); PrintStream old = System.out; System.setOut(ps); int randomNum; for ( int i = 0 ; i < MAXCOUNT; i ++ ) { randomNum = ( int ) (Math.random() * 10000 ); raf.writeInt(randomNum); System.out.print(randomNum + " /t " ); if ((i + 1 ) % 5 == 0 ) { System.out.println(); } } System.setOut(old); ps.close(); fos.close(); } public static void main(String[] args) throws IOException { RandomAccessFile rafa[] = new RandomAccessFile[ 10 ]; // 外部文件 等待归并 RandomAccessFile rafb = null ; // 外部文件 归并目标 int min; // 等待归并的元素 定位 createRandomNumberFile(); long t1,t2; t1 = System.currentTimeMillis(); System.out.println( "" + " 排序开始: " + t1); for ( int i = 0 ; i < 100 ; i ++ ) { readRandomNumberFile( " raw " ,i * 10 , 10 ); // 读10个 sort_arr(); // 排序 writeRandomNumberFile( " raw10_ " + i, 0 , 10 ); // 写小文件 } for ( int i = 0 ; i < 10 ; i ++ ) { rafb = new RandomAccessFile( " raw100_ " + i, " rw " ); // 读入10个 for ( int j = 0 ; j < 10 ; j ++ ) { rafa[j] = new RandomAccessFile( " raw10_ " + ( 10 * i + j), " rw " ); arr[j] = rafa[j].readInt(); } // 剩余90个 for ( int j = 0 ; j < 100 ; j ++ ) { min = 0 ; for ( int k = 0 ; k < 10 ; k ++ ) { if (arr[k] !=- 1 ) min = k; } // 找到最小 for ( int k = 0 ; k < 10 ; k ++ ) { if (arr[k] < arr[min] && arr[k] !=- 1 ) min = k; } // 保存 if (arr[min] !=- 1 ){ rafb.writeInt(arr[min]); } // 替补读入 if ( rafa[min].getFilePointer() < rafa[min].length() && arr[min] !=- 1 ) { arr[min] = rafa[min].readInt(); } else { arr[min] =- 1 ; } } } for ( int j = 0 ; j < 10 ; j ++ ) { rafa[j].close(); rafa[j] = null ; } rafb.close(); rafb = null ; rafb = new RandomAccessFile( " raw1000 " , " rw " ); // 读入10个 for ( int i = 0 ; i < 10 ; i ++ ) { rafa[i] = new RandomAccessFile( " raw100_ " + i, " rw " ); arr[i] = rafa[i].readInt(); } // 剩余990个 for ( int i = 0 ; i < 1000 ; i ++ ) { min = 0 ; for ( int k = 0 ; k < 10 ; k ++ ) { if (arr[k] !=- 1 ) min = k; } // 找到最小 for ( int k = 0 ; k < 10 ; k ++ ) { if (arr[k] < arr[min] && arr[k] !=- 1 ) min = k; } // 保存 if (arr[min] !=- 1 ){ rafb.writeInt(arr[min]); } // 替补读入 if ( rafa[min].getFilePointer() < rafa[min].length() && arr[min] !=- 1 ) { arr[min] = rafa[min].readInt(); } else { arr[min] =- 1 ; } } for ( int j = 0 ; j < 10 ; j ++ ) { rafa[j].close(); rafa[j] = null ; } rafb.close(); rafb = null ; t2 = System.currentTimeMillis(); System.out.println( "" + " 排序结束: " + t2); System.out.println( "" + " 用时 ( " + (t2 - t1) + " ms) " ); Raw2Txt( " raw1000 " , " sort1000.txt " , 1000 ); for ( int i = 0 ; i < 10 ; i ++ ) { File n = new File( " raw100_ " + i, " rw " ); n.delete(); n = null ; } for ( int i = 0 ; i < 100 ; i ++ ) { File n = new File( " raw10_ " + i, " rw " ); n.delete(); } } public static void sort_arr( ){ int tmp; for ( int i = 0 ; i < 9 ; i ++ ) { for ( int j = i + 1 ; j < 10 ; j ++ ) { if (arr[i] > arr[j]) { tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } } } } // 从位置m,读入n个整数到arr数组 public static void readRandomNumberFile(String file, long m, long n) throws IOException { RandomAccessFile raf = new RandomAccessFile(file, " rw " ); raf.seek(Integer.SIZE / 8 * (m)); for ( int i = 0 ; i < n; i ++ ) { arr[i] = raf.readInt(); } } // 从位置m,将arr数组的n个整数写入文件 public static void writeRandomNumberFile(String file, long m, long n) throws IOException { RandomAccessFile raf = new RandomAccessFile(file, " rw " ); raf.seek(Integer.SIZE / 8 * (m)); for ( int i = 0 ; i < n; i ++ ) { raf.writeInt(arr[i]); } } public static void Raw2Txt(String src,String dst, long n) throws IOException { int tmp; RandomAccessFile raf = new RandomAccessFile(src, " rw " ); FileOutputStream fos = new FileOutputStream(dst); PrintStream ps = new PrintStream(fos); PrintStream old = System.out; System.setOut(ps); for ( int i = 0 ; i < n; i ++ ) { tmp = raf.readInt(); System.out.print(tmp + " /t " ); if ((i + 1 ) % 5 == 0 ) { System.out.println(); } } System.setOut(old); ps.close(); fos.close(); } }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值