数据结构作业之数组

数据结构作业之数组

/* 
    编程作业 
    2.1 向highArray.java程序(清单2.3)的HighArray类添加一个名为getMax()的方法,它返回 
        数组中最大关键字的值,当数组为空时返回-1。向main()中添加一些代码来使用这个方法。 
        可以假设所有关键字都是正数。 
    2.2 修改编程作业2.1中的方法,使之不仅返回最大的关键字,而且还将该关键字从数组中删除。 
        将这个方法命名为removeMax()。 
    2.3 编程作业2.2中的removeMax()方法提供了一种通过关键字值进行数组排序的方法。实现一个 
        排序方案,要求不修改HighArray类,只需对main()中的代码进行修改。这个方法需要第二个 
        数组,在排序结束时数组数据项是逆序排列的。(这个方法是第3章“简单排序”中选择排序的 
        一个变体。) 
    2.4 修改orderedArray.java程序(清单2.4)使insert()、delete()与find()方法一样都使用 
        二分查找,正如书中所建议的那样。 
    2.5 向orderedArray.java程序(清单2.4)的OrdArray类加入一个merge()方法,使之可以将两个 
        有序的源数组合并成一个有序的目的数组。在main()中添加代码,向两个源数组中插入随机数, 
        调用merge()方法,并将结果目的数组显示出来。两个源数组的数据项个数可能不同。在算法中 
        需要先比较源数组中的关键字,从中选出最小的一个数据项复制到目的数组。同时还要考虑如何 
        解决当一个源数组的数据项已经取完而另一个还剩一些数据项情况。 
    2.6 向highArray.java程序(清单2.3)的HighArray类中加入一个noDup()方法,使之可以将数组中 
        的所有重复数据项删除。即如果数组中有三个数据项的关键字为17,noDup()方法会删除其中的 
        两个。不必考虑保持数据项的顺序。一种方法是先用每一个数据项同其他数据项比较,并用null 
        (或是一个不会用在真正的关键字中的特殊值)将重复的数据项覆盖掉。然后将所有的null删除, 
        当然还要缩小数组的大小。 
 */  
package 数据结构作业;

public class HighArray {

    private long [] a;
    private int nElems;
    public HighArray(int max)
    {
        a = new long[max];
        nElems = 0;
    }
    //查找的方法的实现
    public boolean find(long searchKey)
    {
        int j;
        for(j=0;j<nElems;j++)
        {
            if(a[j] == searchKey)
            {
                break;
            }
            
        }
        if(j == nElems)
        {
            return false;
        }else{
            return true;
        }
    }
    
    //插入元素的实现
    public void insert(long value)
    {
        a[nElems] = value;
        nElems++;
    }
    
    //删除元素的实现
    public boolean delete(long value)
    {
        int j;
        for(j=0;j<nElems;j++)
        {
            if(value == a[j])
            {
                break;
            }
        }
        if(j == nElems)
        {
            return false;
        }else{
            for(int k = j;k<nElems;k++)
            {
                a[k] = a[k+1];//// 这里不是多移了一次 当k=nElems-1时, a[nElems-1] = a[nElems]; 此时a[nElems]为空  
            
            }
            nElems--;
            return true;
        }
        
        
    }

    public void display()
    {
        for (int j = 0; j < nElems; j++)  
            // for each element,  
            System.out.print(a[j] + " "); // display it  
        System.out.println(""); 
    }
    
    //作业2.1
    public long getMax()
    {
        long max = -1;//最大元素的值
        for(int j=0;j<nElems;j++)
        {
            if(a[j] > max)
            {
                max = a[j];
            }
        }
        return max;
        
    }

    //作业2.2
    public long removeMax()
    {
        long max = -1;//最大元素的值
        int index = -1;//最大元素的索引号
        for(int j=0;j<nElems;j++)
        {
            if(a[j] > max)
            {
                max = a[j];
                index = j;
            }
        }
        
        if(index != -1)//找到最大元素的值
        {
            for(int i = index+1;i<nElems;i++)
            {
                a[i-1] = a[i];
            }
            nElems--;
        }
        
        return max;
        
        
    }
    
    /**
     * 向highArray.java程序(清单2.3)的HighArray类中加入一个noDup()方法,使之可以将数组中 
        的所有重复数据项删除。即如果数组中有三个数据项的关键字为17,noDup()方法会删除其中的 
        两个。不必考虑保持数据项的顺序。一种方法是先用每一个数据项同其他数据项比较,并用null 
        (或是一个不会用在真正的关键字中的特殊值)将重复的数据项覆盖掉。然后将所有的null删除, 
        当然还要缩小数组的大小。
     */
    
    
    public void noDup()
    {
        int NULL = -1;//用-1作为一个特殊值
        for(int j=0;j<nElems;j++)
        {
            for(int i=j+1;i<nElems;i++)
            {
                if(a[j] != NULL && a[j] == a[i])
                {
                    a[i] = NULL;
                }
            }
        }
        
        for(int i=0;i<nElems;)
        {
            if(a[i] == NULL)//注意移动完成之后不要i++,再次检查当前位置是不是NULL        
            {
                for(int j = i+1;j<nElems;j++)
                {
                    a[j-1] = a[j];
                }
                nElems--;
            }else{
                i++;//不是NULL,就直接i++.
            }
        }
        
        
        
    }
    
    
    
    
    
    
    
    
    
}
---------------------------------------------------------------------------------package 数据结构作业;


/**
 * 向highArray数组中添加一个名为getMax的方法
 * 它返回的是最大的关键字的值
 * @author Administrator
 *
 */
public class demo2 {

    
    
    
    public static void main(String[] args) {
        int maxSize = 100;
        HighArray arr = new HighArray(maxSize);
         arr.insert(77); // insert 10 items  
            arr.insert(99);  
            arr.insert(44);  
            arr.insert(55);  
            arr.insert(22);  
            arr.insert(88);  
            arr.insert(11);  
            arr.insert(00);  
            arr.insert(66);  
            arr.insert(33);  
      
            arr.display(); // display items  
      
            int searchKey = 35; // search for item  
            if (arr.find(searchKey))  
                System.out.println("Found " + searchKey);  
            else  
                System.out.println("Can't find " + searchKey);  
      
            arr.delete(00); // delete 3 items  
            arr.delete(55);  
            arr.delete(99);  
      
            arr.display(); // display items again  
      
            // =======================================================  
            //  编程作业2.1  
            long max = arr.getMax();  
            System.out.println("Found max is " + max);  
            // =======================================================  
            //  编程作业2.2  
            arr.removeMax();  
            arr.display();  
            // =======================================================  
            //  编程作业2.3  
            HighArray sortedArr = new HighArray(maxSize);  
            int i = 0;  
            max = arr.removeMax();  
            while (max != -1) {  
                sortedArr.insert(max);  
                max = arr.removeMax();  
            }  
            System.out.println("逆序排列:");  
            sortedArr.display();  
            // =======================================================  
            arr.insert(77); // insert 10 items  
            arr.insert(99);  
            arr.insert(44);  
            arr.insert(55);  
            arr.insert(22);  
            // 重复值  
            arr.insert(44);  
            arr.insert(77);  
            arr.insert(44);  
            arr.insert(66);  
      
            arr.insert(88);  
            arr.insert(11);  
            arr.insert(00);  
            arr.insert(66);  
            arr.insert(33);  
      
            System.out.println("加入重复值后:");  
            arr.display();  
            // arr.noDup();  
            arr.noDup();  
            System.out.println("去掉重复值后:");  
            arr.display();  
            // =======================================================  
        

    }

}

 

posted on 2015-01-19 17:48  aicpcode  阅读(230)  评论(0编辑  收藏  举报

导航