插入排序的思想解决几类问题

来源:互联网 发布:企业开淘宝网店交税 编辑:程序博客网 时间:2024/06/05 17:56

3.2在isertSort.java程序(清单3.3)中给ArrayIns类加一个median()方法.这个方法将返回 数组的中间值.(回忆一下,数组中一半数据项比中间值大,一半数据项比中间值小。)
3.3在insertSort.java程序(清单3.3)中增加一个名为noDups()的方法,这个方法从已经有 序的数组中删掉重复的数据项而不破坏有序性。(可以用insertionSort()方法对数据排序, 或者也可以简单地用main()方法将数据有序地插入到表中。)一种解决方法是每发现一个重 复的数据,就从这个位置开始到数组结尾都向前移动一个位置,但这样就导致消耗很长的 O(N2)的时间级,起码在有很多重复数据项的情况下是这样的。在设计的算法中,不论有多 少重复数据,要确保数据项最多只能移动一次。这样算法只消耗O(N)数量级的时间。
3.5修改insertSort.java程序(清单3.3)中的insertionSort()方法,使它可以计算排序过 程中复制和比较的次数并显示出总数。为计算比较的次数,要把内层while循环的两个条件分开。用这个程序测量各种数量的逆序数据排序的复制和比较次数。结果满足O(N2)吗?与已经基本有序的数据(仅有很少的数据无序)的情况一样吗?从对基本有序数据排序的表现中可得出关于这个算法效率的什么结论?
3.6有一个有趣的方法用来删除数组中相同的数据项。插入排序算法中用一个循环嵌套算法,将数组中的每一个数据项与其他数据项一一比较。如果要删除相同的数据项,可以这样做(参见第30.2章第2.6小节)。修改insertSort.java中的insertionSort()方法,使它可以在排序过程中删除相同的数据项。方法如下:当找到一个重复数据项的时候,通常用一个小于任何值的关键值来改写这个相同数据项(如果所有值都是正数,则可取-1)。于是,一般的插入排序算法就会像处理其他数据项一样,来处理这个修改了关键值的数据项,把它移到下标为0的位置。从现在开始,算法可以忽略这个数据项。下一个相同的数据项将被移到下标为1的位置,依此类推。排序完成后,所有相同的数据项(现在关键值为-1)都在数组的开头部分。可以改变数组的容量并把需要的数据前移动数组下标为0的位置。


public class ArrayIns {    private long[] a ;    private int nElems;    public ArrayIns(int max){        a = new long[max];        nElems = 0;    }    public void insert(long value){        a[nElems] = value;        nElems++;    }    public void display(){        for(int j = 0;j < nElems;j++)            System.out.print(a[j]+" ");        System.out.println("");    }    //===========================================================================    //插入排序    public void insertSort(){        int in,out;        for(out =1;out<nElems;out++){            long temp = a[out];//remove marked item            in = out;//start shifts at out            while(in>0&&a[in-1]>=temp){                a[in]=a[in-1];//shift item to right                --in;//go left one position            }            a[in]=temp;//insert marked item        }    }    //==========================================================================    //编程作业 3.5    public int insertSort1(){        int in,out;        int compare = 0;//比较次数        int copy = 0;//复制次数        for(out=1;out<nElems;out++){            long temp =a[out];            in = out;            while(in>0){                if(a[in-1]>temp){                    a[in]=a[in-1];                    --in;                    compare++;                    copy++;                }                else{                    compare++;                    break;                }            }            a[in]=temp;        }        return compare+copy;    }    //======================================================================    //编程作业3.6    public void insertSort2(){        int in,out,count=0;        for(out=1;out<nElems;out++){            long temp = a[out];            in = out;            while(in>0&&a[in-1]>=temp&&a[in-1]!=-1){                if(a[in-1]==temp){                    temp=-1;                    count++;                }                a[in]=a[in-1];                --in;            }            a[in]=temp;        }        nElems-=count;        for(int i=0;i<nElems;i++){            a[i]=a[i+count];//把排序好的元素向前移动count个位置        }    }    //===================================================================    //编程作业3.2    public long median(){        this.insertSort();//先排序再取中间值        return a[nElems/2];    }    //=============================================================    //编程作业3.3    public void noDups(){        this.insertSort();//先排序        int holenumber = 0;        final int FLAG = -1;        for(int i=0;i<nElems;i++){            for(int j=i+1;j<nElems;j++){                if(a[i]==a[j]&&a[j]!=FLAG){                    a[j]=FLAG;                    holenumber++;                }            }        }        int firsthole=-1;        for (int i = 0; i < nElems; i++) {            if (a[i] == FLAG && firsthole == -1) {                firsthole = i;            }            else if (a[i] != FLAG && firsthole != -1) {                a[firsthole++] = a[i];            }        }        nElems -= holenumber;    }}
public class InsertSortApp {    /**     * @param args     */    public static void main(String[] args) {        // TODO Auto-generated method stub        int maxSize=100;        ArrayIns arr;        arr = new ArrayIns(maxSize);        arr.insert(77);        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();        arr.insertSort();        arr.display();        arr = new ArrayIns(maxSize);        arr.insert(2);        arr.insert(3);        arr.insert(4);        arr.insert(3);        arr.insert(3);        arr.insert(1);        arr.insert(2);        arr.insert(1);        arr.insert(1);        arr.insert(1);        System.out.println("插入重复值后:");        arr.display();        arr.noDups();        System.out.println("删除重复值后:");        arr.display();        arr = new ArrayIns(maxSize);        int count;        for (int i = 19; i >= 0; i--) {// 初始化为逆序数组            arr.insert(i);        }        arr.insert(19);        arr.insert(9);        arr.insert(0);        arr.display();        count = arr.insertSort1();        arr.display();        System.out.println("逆序数组比较复制总数:" + count); // 满足O(N^2) 229. 230.        arr = new ArrayIns(maxSize); // create the array        for (int i = 19; i >= 0; i--) {// 初始化为逆序数组            arr.insert(i);        }        arr.insert(19);        arr.insert(9);        arr.insert(0);        arr.display();        count = arr.insertSort1();        arr.display();        System.out.println("顺序数组比较复制总数:" + count);        arr = new ArrayIns(maxSize); // create the array        arr.insert(2);        arr.insert(3);        arr.insert(4);        arr.insert(3);        arr.insert(3);        arr.insert(1);        arr.insert(2);        arr.insert(1);        arr.insert(1);        arr.insert(1);        System.out.println("插入重复值后:");        arr.display();        arr.insertSort2();        System.out.println("删除重复值后:");        arr.display();    }}
1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 用夜神模拟器玩第五人格太卡怎么办 雷电模拟器玩刺激战场太卡了怎么办 绝地求生刺激战场模拟器太卡怎么办 ddj sb2打碟功能没了怎么办 驼背怎么办 要能快速矫正的方法 苹果7中间的home键坏了怎么办 苹果6p的home键不管用怎么办 华为获取数据失败请检查网络怎么办 三星手机未解锁刷机变砖怎么办 手机显示充电但是充不进去怎么办 手机拔出显示无法连接移动网怎么办 手机上的音乐老是显示网络忙怎么办 华为手机账号换手机忘记密码怎么办 墨墨背单词的注册邮箱忘了怎么办 华为手机华为账号密码忘记了怎么办 手机玩游戏降频特别厉害怎么办 苹果应用商店id登录老卡怎么办 苹果id忘记了自动续费怎么办 红米手机小米账号密码忘了怎么办 小米5splus没系统卡米怎么办 注册谷歌账号输入手机好怎么办 谷歌注册电话号码用了太多次怎么办 内存卡用了深度清理的软件怎么办 华为畅享5s密码忘了怎么办 小米5s进水了一直开机关机怎么办 手机菜单键功能键返回键失灵怎么办 小米5s更新系统发热严重怎么办 小米手机4G网速不好怎么办力 红米5 plus开不开机怎么办 小米3s手机触屏部分失灵怎么办 魅族手机屏幕锁密码忘了怎么办 手机没设置魅族账号密码忘了怎么办 魅族手机格式化密码忘了怎么办 魅族手机忘记密码了怎么解锁怎么办 手机设置的应用加密忘记密码怎么办 手机上设置应用加密忘记密码怎么办 魅蓝flyme密码忘了怎么办图片 魅族手机经常自动账号锁屏怎么办 魅族锁定后又不知道密码怎么办 魅族手机锁屏锁定了怎么办 魅族手机已锁定怎么办密码忘了