一、实验题目

题一:以下是鸡尾酒冒泡的代码,请同学调通代码,并将鸡尾酒冒泡改进成“带有序区的鸡尾酒冒泡”,即数列两端添加有序区标记。(要求:实验报告需附带实验代码,关键注释,实验结果截图,另外:实验使用的测试用例数列可以自己生成,所用数列应不小于50个元素)

public static void sort(int array[])

{

    int tmp = 0;

    for(int i=0; i<array.length/2; i++)

    {

//有序标记,每一轮的初始值都是true

        boolean isSorted = true;

//奇数轮,从左向右比较和交换

        for(int j=i; j<array.length-i-1; j++)

        {

            if(array[j] > array[j+1])

            {

                tmp = array[j];

                array[j] = array[j+1];

                array[j+1] = tmp;

// 有元素交换,所以不是有序的,标记变为false

                isSorted = false;

            }

        }

        if(isSorted){

            break;

        }

// 在偶数轮之前,将isSorted重新标记为true

        isSorted = true;

//偶数轮,从右向左比较和交换

        for(int j=array.length-i-1; j>i; j--)

        {

            if(array[j] < array[j-1])

            {

                tmp = array[j];

                array[j] = array[j-1];

                array[j-1] = tmp;

// 因为有元素进行交换,所以不是有序的,标记变为false

                isSorted = false;

            }

        }

        if(isSorted){

            break;

        }

    }

}

public static void main(String[] args){

    int[] array = new int[]{  你的测试用例  };

    sort(array);

    System.out.println(Arrays.toString(array));

}

题二:乱序输出0~99共一百个正整数。要求:输出的正整数不能重复,在实验报告中简述你的完成思路,以及输出顺序的随机性是通过什么技巧(原理)得到的。另外:不限制实现语言,用excel或matlab做出来的也算成功。

二、实验思路和方案

题一:

使用sort方法对数组进行排序,先从左到右进行冒泡排序,然后从右到左进行冒泡排序,逐步缩小排序范围。排序过程中使用了两个标记 (rightChange 和 leftChange) 来调整当前的排序边界,减少不必要的比较,提高了代码运行效率。

题二:

首先创建一个集合,然后通过创建Random类对象r,并调用其中的nextInt(100)方法可以随机生成一个0到99的整数,为了保证不重复,自己写了一个contains方法来判断生成的整数ran是否在集合list当中,假如ran不在集合中就说明不重复,能够添加到集合中。

三、实验代码

题一:

public class JiWeiJiu2 {

    public static void main(String[] args) {

        int[] array = new int[]{57, 94, 13, 1, 84, 33, 3, 25, 55, 43, 54, 42, 34, 49, 17, 22, 98,

                29, 32, 2, 23, 74, 97, 31, 85, 37, 58, 24, 44, 5, 81, 52, 4, 73, 92, 6, 27, 10, 96,

                68, 18, 62, 56, 36, 11, 50, 79, 86, 19, 95, 99, 45, 87, 69, 20, 59, 76, 7, 12, 75,

                30, 77, 46, 48, 78, 14, 40, 70, 16, 0, 90, 88, 15, 47, 93, 65, 67, 53, 82, 21, 28,

                83, 64, 71, 39, 63, 60, 38, 61, 91, 89, 35, 66, 80, 72, 41, 26, 51, 9, 8};

        sort(array);

        for (int i = 0; i < array.length; i++) {

            if (i % 10 == 0) {

                System.out.print("\n" + array[i] + ", ");

            } else {

                System.out.print(array[i] + ", ");

            }

        }

    }

    private static void sort(int array[]) {

        int temp = 0;

        //定义最后一次左右交换的位置

        int rightChange = 0;

        int leftChange = 0;

        //定义左右边界

        int right = array.length - 1;

        int left = 0;

        for (int i = 0; i < array.length / 2; i++) {

            //有序标记,每一轮的初始是true

            boolean isSorted = true;

            //奇数轮,从左到右

            for (int j = left; j < right; j++) {

                if (array[j] > array[j + 1]) {

                    temp = array[j];

                    array[j] = array[j + 1];

                    array[j + 1] = temp;

                    //元素有交换,所以不是有序,标记变为false

                    isSorted = false;

                    rightChange = j;

                }

            }

            right = rightChange;

            if (isSorted) {

                break;//数列有序的时候,没有交换,跳出循环

            }

            //偶数轮,从右到左

            for (int j = right; j > left; j--) {

                if (array[j] < array[j - 1]) {

                    temp = array[j];

                    array[j] = array[j - 1];

                    array[j - 1] = temp;

                    //元素有交换,所以不是有序,标记变为false

                    isSorted = false;

                    leftChange = j;

                }

            }

            left = leftChange;

            if (isSorted) {

                break;//数列有序的时候,没有交换,跳出循环

            }

        }

    }

}

题二:

import java.util.ArrayList;

import java.util.Random;

public class random099 {

    public static void main(String[] args) {

        ArrayList<Integer> list = new ArrayList<>();

        Random r = new Random();

        int i = 0;

        while (i < 100) {

            int ran = r.nextInt(100);

            if (!(contains(list, ran))) {

                list.add(ran);

                i++;

            }

        }

        for (int j = 0; j < list.size(); j++) {

            Integer rightRan = list.get(j);

            if (j % 10 == 0) {

                System.out.print("\n" + rightRan + ", ");

            } else {

                System.out.print(rightRan + ", ");

            }

        }

    }

    public static boolean contains(ArrayList<Integer> list, int ran) {

        for (int i = 0; i < list.size(); i++) {

            Integer ran1 = list.get(i);

            if (ran == ran1) {

                return true;

            }

        }

        return false;

    }

}

四、实验结果及分析

题一:

题二:

五、实验总结及体会

题一:

鸡尾酒排序不仅向右排序,还向左排序。这样可以更快地将大值移动到数组的右端,同时也可以将小值移动到数组的左端,从而在每一轮排序中更加均衡地处理元素。

由于在每一轮排序过程中,鸡尾酒排序会从两端向中间推进,可以减少总的比较次数。

算法通过使用 isSorted 标记来检测数据是否已经有序。如果在某轮排序过程中没有发生任何交换,算法会提前终止,避免了不必要的比较,从而提高了代码运行效率。

题二:

Random类可以生成随机数,但是不能保证不重复,因此需要对生成的随机数进行判断,若不重复则满足条件,可以添加到集合当中去。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐