双向冒泡与奇偶冒泡


3.1 bubbleSort.java程序(清单3.1)和BubbleSort专题applet中,in索引变量都是从左到 右移动的,直到找到最大数据项并把它移动到右边的out变量外。修改bubbleSort()方法, 使它成为双向移动的。这样,in索引先像以前一样,将最大的数据项从左移到右,当它到 达out变量位置时,它掉头并把最小的数据项从右移到左。需要两个外部索引变量,一个在 右边(以前的out变量),另一个在左边。
3.4 还有一种简单排序算法是奇偶排序。它的思路是在数组中重复两趟扫描。第一趟扫描选择所有 1的数据项对,a[j]和a[j+1],j是奇数(j=1,3,5,……)。如果它们的关键字的值次序颠倒,就交 1换它们。第二趟扫描对所有的偶数数据项进行同样的操作(j=2,4,6,……)。重复进行这样两趟的排序直到数组全部有序。用oddEvenSort()方法替换bubbleSort.java程序(清单3.1)中的 bubbleSort()方法。确保它可以在不同数据量的排序中运行,还需要算出两趟扫描的次数。奇 偶排序实际上在多处理器环境中很有用,处理器可以分别同时处理每一个奇数对,然后又同时 处理偶数对。因为奇数对是彼此独立的,每一对都可以用不同的处理器比较和交换。这样可以非常快速地排序。



public class ArrayBub {
    private long[] a;
    private int nElems;

    public ArrayBub(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 bubbleSort(){
        int out,in;
        for(out = nElems-1;out>0;out--)
            for(in=0;in<out;in++){
                if(a[in]>a[in+1])
                    swap(in,in+1);
            }
    }

    private void swap(int one,int two){
        long temp = a[one];
        a[one]=a[two];
        a[two]=temp;
    }

    //======================================================
    //编程作业3.1
    public void bubbleSort1(){
        int leftout = 0,rightout = nElems-1,in;
        for(;leftout<rightout;leftout++,rightout--){
            for(in =leftout;in< rightout;in++){
                if(a[in]>a[in+1]){
                    swap(in,in+1);
                }
            }
            for(in =rightout;in> leftout;in--){
                if(a[in]<a[in-1]){
                    swap(in,in-1);
                }
            }
        }
    }

    //=========================================================
    //编程作业3.4
    public void oddEvenSort(){
        boolean change = true;
        while(change){
            change = false;
            for(int i = 0;i < nElems-1;i+=2){
                if(a[i]>a[i+1]){
                    swap(i,i+1);
                    change =true;
                }
            }
            for(int i = 1;i < nElems-1;i+=2){
                if(a[i]>a[i+1]){
                    swap(i,i+1);
                    change =true;
                }
            }

        }
    }

}

public class BubbleSortApp {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int maxSize = 100;
        ArrayBub arr;
        arr = new ArrayBub(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.bubbleSort();
        arr.display();

        arr = new ArrayBub(maxSize);
        arr.insert(4);
        arr.insert(3);
        arr.insert(2);
        arr.insert(1);
        arr.display();
        arr.bubbleSort1();
        arr.display();

        ArrayBub arr1 = new ArrayBub(maxSize);
        arr1.insert(8);
        arr1.insert(7);
        arr1.insert(6);
        arr1.insert(5);
        arr1.display();
        arr1.oddEvenSort();//奇偶排序
        arr1.display();

    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值