排序问题实验
本实验包含两个题目:题一实现了带有序区标记的改进版鸡尾酒排序算法,通过在数组两端设置有序区边界(rightChange和leftChange)来优化排序过程;题二实现了0-99不重复随机数的生成,通过Random类产生随机数并使用contains方法确保不重复。实验结果显示,改进后的鸡尾酒排序能有效减少比较次数,提高排序效率;随机数生成程序通过循环检测机制保证了输出的唯一性。实验验证了双向排序的优
一、实验题目
题一:以下是鸡尾酒冒泡的代码,请同学调通代码,并将鸡尾酒冒泡改进成“带有序区的鸡尾酒冒泡”,即数列两端添加有序区标记。(要求:实验报告需附带实验代码,关键注释,实验结果截图,另外:实验使用的测试用例数列可以自己生成,所用数列应不小于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类可以生成随机数,但是不能保证不重复,因此需要对生成的随机数进行判断,若不重复则满足条件,可以添加到集合当中去。
更多推荐



所有评论(0)