XJTUSE-数据结构-homework1

任务 1

题目:

排序算法设计:

需要写Selection、Shell、Quicksort 和 Mergesort四种排序算法,书上讲述比较全面而且不需要进行额外的优化,下面我简要地按照自己的理解讲述。

Selection(选择排序):

关键代码:

for (int i=0;i< arr.length;i++){  
            int temp = i;  
            for (int j=i;j<arr.length;j++){  
                if (less(arr[j],arr[temp])){  
                    temp = j;  
                }  
            }  

通过两个循环完成排序。其中第一个循环是选择次数,第二个循环保证较大/较小的元素可以往前交换。

Shell(希尔排序):

关键代码:

int temp = 1;  
        while (temp*3<len){  
            temp = temp*3;  
        }  
        for (int gap = temp;gap>0;gap /= 3){  
            for (int i=gap;i<len;i++){  
                for (int j= i;j>=gap&&less(arr[j],arr[j-gap]);j-=gap){  
                    exchange(arr,j,j-gap);  
                }  
            }  
        }  

希尔排序相当于多次有间隔的选择排序,从间隔较大的开始,起到了局部的排序,减少了排序的平均时间,再到间隔为1的,保证了该排序算法的有效性。

可以注意到,该间隔为3以及3的倍数,这会导致长度为2的排序失效,因此需要考虑长度为2的特殊情况。

我添加了以下代码:

if (len<3){  
    new Selection().sort(arr);  
    return;  
}  

保证了Shell排序算法无论输入数组长度为何值都是正确的。

Quicksort(快速排序算法):

快速排序通过“随机”选择一个数,交换,比较,再交换,最后子数组递归,保证了排序的准确性,而且相较于前面的排序算法,该算法时间复杂度大大提升至O(nlogn)。具体代码在附录可见。

Mergesort(归并排序):

这是经典的空间换取时间的排序算法。

关键方法如下:

private void mergeSort(Comparable[] arr,Comparable[] temArr, int left,int right);  
private void merge(Comparable[] arr,Comparable[] temArr, int leftPos,int rightPos,int rightEnd); 

其中mergeSort反复递归,merge是用来合并两个子数组成为一个有序的父数组。

通过当子数组长度为1为边界条件保证了排序的准确性。

接下来就是测试编写的四种排序算法的正确性,我参考老师提供的SortTest编写了Test类,随机选择数据量,多次运行,其isSorted结果均为true。

以下为测试结果:

这是Insertion测试:  
数据量为100,验证结果为:true  
数据量为1000,验证结果为:true  
数据量为10000,验证结果为:true  
这是Shell测试:  
数据量为100,验证结果为:true  
数据量为1000,验证结果为:true  
数据量为10000,验证结果为:true  
这是Quicksort测试:  
数据量为100,验证结果为:true  
数据量为1000,验证结果为:true  
数据量为10000,验证结果为:true  
这是Selection测试:  
数据量为100,验证结果为:true  
数据量为1000,验证结果为:true  
数据量为10000,验证结果为:true  
这是Mergesort测试:  
数据量为100,验证结果为:true  
数据量为1000,验证结果为:true  
数据量为10000,验证结果为:true  

任务2

题目:

将老师提供的SortTest进行了如下更改:

1.根据数据改变了数据量数组;

2.输出文字进行改变

测试结果(时间单位为ns)如下:

这是Insertion测试:  
数据量2^8,5次平均1322680.0000  
 数据量2^9,5次平均1468760.0000  
 数据量2^10,5次平均2458300.0000  
 数据量2^11,5次平均4726600.0000  
 数据量2^12,5次平均18527580.0000  
 数据量2^13,5次平均74433980.0000  
 数据量2^14,5次平均357883060.0000  
 数据量2^15,5次平均1593175460.0000  
 数据量2^16,5次平均6490592300.0000  
 这是Shell测试:  
数据量2^8,5次平均153680.0000  
 数据量2^9,5次平均311600.0000  
 数据量2^10,5次平均405260.0000  
 数据量2^11,5次平均352040.0000  
 数据量2^12,5次平均841920.0000  
 数据量2^13,5次平均1360680.0000  
 数据量2^14,5次平均2785880.0000  
 数据量2^15,5次平均7956360.0000  
 数据量2^16,5次平均20619880.0000  
 这是Quicksort测试:  
数据量2^8,5次平均225160.0000  
 数据量2^9,5次平均118000.0000  
 数据量2^10,5次平均241120.0000  
 数据量2^11,5次平均473040.0000  
 数据量2^12,5次平均759900.0000  
 数据量2^13,5次平均1666420.0000  
 数据量2^14,5次平均6832760.0000  
 数据量2^15,5次平均4231260.0000  
 数据量2^16,5次平均9369600.0000  
 这是Selection测试:  
数据量2^8,5次平均599240.0000  
 数据量2^9,5次平均783020.0000  
 数据量2^10,5次平均2269340.0000  
 数据量2^11,5次平均2438100.0000  
 数据量2^12,5次平均8725240.0000  
 数据量2^13,5次平均33024260.0000  
 数据量2^14,5次平均141893780.0000  
 数据量2^15,5次平均701216720.0000  
 数据量2^16,5次平均3065605780.0000  
 这是Mergesort测试:  
数据量2^8,5次平均145160.0000  
 数据量2^9,5次平均71820.0000  
 数据量2^10,5次平均154580.0000  
 数据量2^11,5次平均343920.0000  
 数据量2^12,5次平均729580.0000  
 数据量2^13,5次平均1674500.0000  
 数据量2^14,5次平均14065500.0000  
 数据量2^15,5次平均29093740.0000  
 数据量2^16,5次平均21794940.0000  

(数据具有随机性,下面的图像与上面数据不符合)

画出的图像如下:

总结:

       1.所有算法的运行时间随着数据量的增大均体现出增长的趋势,但是增长的速度不同,可以看出Insertion和Selection算法的增长速度相似,Shell,Quicksort, Mergesort 增长速度相似,而且前两个算法增长速度大于后三个算法速度。

       2.从运行时间的绝对值来讲,出现了两个拐点,第一个拐点是数据量为2^11时,不同增长速度的算法开始分开,运行时间相差较大。第二个拐点时数据量为2^13时,这时候增长速度相似的算法也开始波动了,这就与算法的具体实现过程有着密切的关系,比如虽然理论值Mergesort和Quicksort的运行时间应该小于Shell,但是实际上并没有多大的差距,这就表明在分配空间和递归的耗时抵消了算法上的优势。

任务3

题目:完成对每一个排序算法在数据规模为:2^8、2^9、2^10、……、2^16 的 k-有序的随机数据的排序时间的统计。(k-有序数据序列有时也被称为近似有序的数据序列)

要求:

 在同等规模的数据量下,要做 T 次运行测试,用平均值做为此次测试的结果,用以排除因数据的不同和机器运行当前的状态等因素造成的干扰;

 在该任务中除了有数据规模的变化外,还有一个可变因子 k,请同学们针对不同的 k 也做一次测试设计。

 将所有排序算法的运行时间结果用图表的方式进行展示,X 轴代表数据规模,Y 轴代表运行时间。(如果因为算法之间运行时间差异过大而造成显示上的问题,可以通过将运行时

间使用取对数的方式调整比例尺)

对实验的结果进行总结,要求同任务 2

代码:对任务二中的稍作修改即可;

数据(时间单位为ns)如下:

k=5

这是Insertion测试:  
数据量2^8,5次平均70240.0000  
 数据量2^9,5次平均73040.0000  
 数据量2^10,5次平均119780.0000  
 数据量2^11,5次平均228200.0000  
 数据量2^12,5次平均465260.0000  
 数据量2^13,5次平均276200.0000  
 数据量2^14,5次平均422700.0000  
 数据量2^15,5次平均668580.0000  
 数据量2^16,5次平均926340.0000  
 这是Shell测试:  
数据量2^8,5次平均81920.0000  
 数据量2^9,5次平均146000.0000  
 数据量2^10,5次平均385620.0000  
 数据量2^11,5次平均290640.0000  
 数据量2^12,5次平均293740.0000  
 数据量2^13,5次平均668400.0000  
 数据量2^14,5次平均629120.0000  
 数据量2^15,5次平均1305220.0000  
 数据量2^16,5次平均2659820.0000  
 这是Quicksort测试:  
数据量2^8,5次平均209900.0000  
 数据量2^9,5次平均96180.0000  
 数据量2^10,5次平均135320.0000  
 数据量2^11,5次平均288840.0000  
 数据量2^12,5次平均629000.0000  
 数据量2^13,5次平均1351740.0000  
 数据量2^14,5次平均3531480.0000  
 数据量2^15,5次平均2995280.0000  
 数据量2^16,5次平均7122440.0000  
 这是Selection测试:  
数据量2^8,5次平均738000.0000  
 数据量2^9,5次平均1435820.0000  
 数据量2^10,5次平均3447300.0000  
 数据量2^11,5次平均3149240.0000  
 数据量2^12,5次平均10804340.0000  
 数据量2^13,5次平均43137980.0000  
 数据量2^14,5次平均174787920.0000  
 数据量2^15,5次平均700124900.0000  
 数据量2^16,5次平均2294058560.0000  
 这是Mergesort测试:  
数据量2^8,5次平均139540.0000  
 数据量2^9,5次平均60960.0000  
 数据量2^10,5次平均107560.0000  
 数据量2^11,5次平均230620.0000  
 数据量2^12,5次平均516120.0000  
 数据量2^13,5次平均1193680.0000  
 数据量2^14,5次平均7410920.0000  
 数据量2^15,5次平均21259640.0000  
 数据量2^16,5次平均8129380.0000  

(数据具有随机性,下面图像与上面数据不一致)

图像:

k=5

(k=10和k=3的数据不再给出,下面是图像)

取值不同的k,可以发现,k-序列排序对五种排序算法均有一定程度的影响。大大增加了Selection排序算法的排序时间。而大幅度减少了Insertion排序算法的排序时间。随着k值的增大可以看出,Selection排序算法排序时间增长,Mergesort和Quicksort在数据量较大时(2^15左右)小幅度影响。

任务4

题目:

完成了任务 2 和任务 3 之后,现要求为 GenerateData 类型再增加一种数据序列的生成方法, 该方法要求生成分布不均匀数据序列:1/2 的数据是 0,1/4 的数据是 1,1/8 的数据是 2 和 1/8 的 数据是 3。对这种分布不均匀的数据完成类似任务 2 的运行测试,检查这样的数据序列对于排序算 法的性能影响。要求同任务 2。(此时,可以将任务 2、任务 3 和任务 4 的运行测试结果做一个纵向比较,用以理解数据序列分布的不同对同一算法性能的影响,如果能从每个排序算法的过程去深 入分析理解则更好。

代码:

生成不均匀数据序列

public static Double[] getRandomData2(int N){  
        Double[] numbers = new Double[N];  
        for(int i = 0; i < N/2; i++)  
            numbers[i] = 0.0;  
        for(int i = N/2; i < 3*N/4; i++)  
            numbers[i] = 1.0;  
        for(int i = 3*N/4; i < 7*N/8; i++)  
            numbers[i] = 2.0;  
        for(int i = 7*N/8; i < N; i++)  
            numbers[i] = 3.0;  
        shuffle(numbers,0, numbers.length-1);  
        return numbers;  
    }  

测试类与任务2,3的基本一致,不再放出。

需要提示的是,这种不均匀序列,我电脑会出现无法(极偶然可以)跑出Quicksort排序算法的结果。足以说明该不均匀序列对Quicksort的“不友好”。

因此Quicksort数据不再给出,图像如下:

下面将进行五种排序算法的纵向比较。

Mergesort

可以看出来,当数据量增大时,不同序列的Mergesort的运行时间逐渐接近,这与该算法的实现密切相关,因为Mergesort的最好、最坏、平均时间均为O(nlogn)。

Shell

可以看出,Shell排序算法在k-有序数据序列(近似有序的数据序列)用时明显减少,而该算法在完全随机序列用时最多。这是因为Shell算法先进行局部排序,最后一趟相当于Insert排序,因此排序序列越近似有序,该算法用时越少。

Insertion

在k-有序数据序列(近似有序的数据序列)下用时远远小于其余两项。这与Insertion实现方式有关。耗时主要是因为Insertion在排序时有着大量交换,在k-有序数据序列每项数据离其正确位置相差不大,因此交换次数少,用时少。而在完全随机序列和不均匀序列中,每项顺序离其正确位置不确定,达到了运行平均时间O(n^2)。

总体而言,三个序列曲线比较吻合,这是因为Selection无论序列特征如何,均要遍历序列找到最小值,次小值……因此,耗时在序列数值的比较,平均时间为O(n^2)。

Quicksort

 因为不均匀序列无法跑出结果,因此没有加入到图像之中。快速排序通过“随机”选择数值进行划分,在我编写的代码中“随机”的数字是中间值,因此在完全随机和k-有序数据序列中运行时间没有明显的差异。但如果“随机”的数字为前面,会导致在k-有序数据序列出现较差的情况,这是“随机”选择的数值不足以平均划分序列,导致运行时间大大增加。

       而不均匀序列无法跑出结果,初步判断为爆栈,因为不均匀序列有大量重复的数值,而且按照一定比例,因此“随机”出来的数值无法平均划分序列的情况大大增加,而且我没有进行任何优化,递归耗时较大,层数较深,导致无法运行出结果。

附录

任务1

public class Quicksort extends SortAlgorithm {  
    @Override  
    public void sort(Comparable[] objs) {  
        quicksort(objs,0,objs.length-1);  
    }  
    private void quicksort(Comparable[] arr, int start, int end){  
        int pickIndex = (start+end)/2;  
        exchange(arr,pickIndex,end);  
        int sortIndex = partition(arr,start,end-1,end);  
        exchange(arr,sortIndex,end);  
        if ((sortIndex-start)>1){  
            quicksort(arr,start,sortIndex-1);  
        }  
        if ((end-sortIndex)>1){  
            quicksort(arr,sortIndex,end);  
        }  
    }  
    private int partition(Comparable[] arr, int start, int end, int pivot){  
        do{  
            while (less(arr[start],arr[pivot])){  
                start++;  
            };  
            while (end!=0&&less(arr[pivot],arr[end])){  
                end--;  
            };  
            exchange(arr,start,end);  
        }while (start<end);  
        exchange(arr,start,end);  
        return start;  
    }  
}  
public class Selection extends SortAlgorithm {  
    @Override  
    public void sort(Comparable[] arr) {  
        for (int i=0;i< arr.length;i++){  
            int temp = i;  
            for (int j=i;j<arr.length;j++){  
                if (less(arr[j],arr[temp])){  
                    temp = j;  
                }  
            }  
            exchange(arr,i,temp);  
        }  
    }  
}  
public class Shell extends SortAlgorithm {  
    @Override  
    public void sort(Comparable[] arr) {  
        int len = arr.length;  
        if (len<3){  
            new Selection().sort(arr);  
            return;  
        }  
        int temp = 1;  
        while (temp*3<len){  
            temp = temp*3;  
        }  
        for (int gap = temp;gap>0;gap /= 3){  
            for (int i=gap;i<len;i++){  
                for (int j= i;j>=gap&&less(arr[j],arr[j-gap]);j-=gap){  
                    exchange(arr,j,j-gap);  
                }  
            }  
        }  
    }  
}  
public class Mergesort extends SortAlgorithm {  
    @Override  
    public void sort(Comparable[] arr) {  
        Comparable[] temArr = new Comparable[arr.length];  
        mergeSort(arr,temArr,0, arr.length-1);  
    }  
    private void mergeSort(Comparable[] arr,Comparable[] temArr, int left,int right){  
        if (left<right){  
            int center = (left+right)/2;  
            mergeSort(arr,temArr,left,center);  
            mergeSort(arr,temArr,center+1,right);  
            merge(arr,temArr,left,center+1,right);  
        }  
    }  
    private void merge(Comparable[] arr,Comparable[] temArr, int leftPos,int rightPos,int rightEnd){  
        int leftEnd = rightPos-1;  
        int tmpPos = leftPos;  
        int numElements = rightEnd - leftPos + 1;  
  
        while (leftPos<=leftEnd&&rightPos<=rightEnd){  
            if (less(arr[leftPos],arr[rightPos])){  
                temArr[tmpPos++]=arr[leftPos++];  
            }  
            else {  
                temArr[tmpPos++]=arr[rightPos++];  
            }  
        }  
  
        while (leftPos<=leftEnd){  
            temArr[tmpPos++]=arr[leftPos++];  
        }  
        while (rightPos<=rightEnd){  
            temArr[tmpPos++]=arr[rightPos++];  
        }  
  
        for (int i=1;i<=numElements;i++,rightEnd--){  
            arr[rightEnd] = temArr[rightEnd];  
        }  
    }  
}  
public class Test {  
    public static boolean judge(SortAlgorithm alg, Double[] numbers){  
        alg.sort(numbers);  
        return alg.isSorted(numbers);  
    }  
    public static boolean test(SortAlgorithm alg, int dataProbabilityType, int dataLength, int k, int T)  
    {  
        boolean flag = true;  
        Double[] numbers = null;  
        for(int i = 0; i < T; i++) {  
            switch(dataProbabilityType){  
                case GenerateData.UNIFORM -> numbers = GenerateData.getRandomData(dataLength);  
            }  
            flag = flag&&judge(alg,numbers);  
        }  
        return flag;  
    }  
    public static void main(String[] args) {  
        int[] dataLength = {100, 1000, 10000};  
        boolean[] judgeSort = new boolean[dataLength.length];  
        SortAlgorithm alg = new Insertion();  
        System.out.println("这是Insertion测试:");  
        for(int i = 0; i < dataLength.length; i++)  
            judgeSort[i] = test(alg, GenerateData.UNIFORM, dataLength[i], 0, 5);  
        for (int i=0;i<dataLength.length;i++){  
            System.out.printf("数据量为%d,验证结果为:%b%n",dataLength[i],judgeSort[i]);  
        }  
        alg = new Shell();  
        System.out.println("这是Shell测试:");  
        for(int i = 0; i < dataLength.length; i++)  
            judgeSort[i] = test(alg, GenerateData.UNIFORM, dataLength[i], 0, 5);  
        for (int i=0;i<dataLength.length;i++){  
            System.out.printf("数据量为%d,验证结果为:%b%n",dataLength[i],judgeSort[i]);  
        }  
        alg = new Quicksort();  
        System.out.println("这是Quicksort测试:");  
        for(int i = 0; i < dataLength.length; i++)  
            judgeSort[i] = test(alg, GenerateData.UNIFORM, dataLength[i], 0, 5);  
        for (int i=0;i<dataLength.length;i++){  
            System.out.printf("数据量为%d,验证结果为:%b%n",dataLength[i],judgeSort[i]);  
        }  
        alg = new Selection();  
        System.out.println("这是Selection测试:");  
        for(int i = 0; i < dataLength.length; i++)  
            judgeSort[i] = test(alg, GenerateData.UNIFORM, dataLength[i], 0, 5);  
        for (int i=0;i<dataLength.length;i++){  
            System.out.printf("数据量为%d,验证结果为:%b%n",dataLength[i],judgeSort[i]);  
        }  
        alg = new Mergesort();  
        System.out.println("这是Mergesort测试:");  
        for(int i = 0; i < dataLength.length; i++)  
            judgeSort[i] = test(alg, GenerateData.UNIFORM, dataLength[i], 0, 5);  
        for (int i=0;i<dataLength.length;i++){  
            System.out.printf("数据量为%d,验证结果为:%b%n",dataLength[i],judgeSort[i]);  
        }  
    }  
}  

任务2

public class Test2 {  
    public static double time(SortAlgorithm alg, Double[] numbers){  
        double start = System.nanoTime();  
        alg.sort(numbers);  
        double end = System.nanoTime();  
        return end - start;  
    }  
    public static double test(SortAlgorithm alg, int dataProbabilityType, int dataLength, int k, int T)  
    {  
        double totalTime = 0;  
        Double[] numbers = null;  
        for(int i = 0; i < T; i++) {  
            switch(dataProbabilityType){  
                case GenerateData.UNIFORM -> numbers = GenerateData.getRandomData(dataLength);  
                case GenerateData.KSORTED -> numbers = GenerateData.getKSortedData(dataLength, k);  
            }  
            totalTime += time(alg, numbers);  
        }  
        return totalTime/T;  
    }  
    public static void main(String[] args) {  
        int[] dataLength = {256,512,1024,2048,4096,8192,16384,32768,65536};  
        double[] elapsedTime = new double[dataLength.length];  
        SortAlgorithm alg = new Insertion();  
        System.out.println("这是Insertion测试:");  
        for(int i = 0; i < dataLength.length; i++)  
            elapsedTime[i] = test(alg, GenerateData.UNIFORM, dataLength[i], 0, 5);  
        for(int i=0;i<dataLength.length;i++)  
            System.out.printf("数据量2^%d,5次平均%6.4f%n ",i+8, elapsedTime[i]);  
        alg = new Shell();  
        System.out.println("这是Shell测试:");  
        for(int i = 0; i < dataLength.length; i++)  
            elapsedTime[i] = test(alg, GenerateData.UNIFORM, dataLength[i], 0, 5);  
        for(int i=0;i<dataLength.length;i++)  
            System.out.printf("数据量2^%d,5次平均%6.4f%n ",i+8, elapsedTime[i]);  
        alg = new Quicksort();  
        System.out.println("这是Quicksort测试:");  
        for(int i = 0; i < dataLength.length; i++)  
            elapsedTime[i] = test(alg, GenerateData.UNIFORM, dataLength[i], 0, 5);  
        for(int i=0;i<dataLength.length;i++)  
            System.out.printf("数据量2^%d,5次平均%6.4f%n ",i+8, elapsedTime[i]);  
        alg = new Selection();  
        System.out.println("这是Selection测试:");  
        for(int i = 0; i < dataLength.length; i++)  
            elapsedTime[i] = test(alg, GenerateData.UNIFORM, dataLength[i], 0, 5);  
        for(int i=0;i<dataLength.length;i++)  
            System.out.printf("数据量2^%d,5次平均%6.4f%n ",i+8, elapsedTime[i]);  
        alg = new Mergesort();  
        System.out.println("这是Mergesort测试:");  
        for(int i = 0; i < dataLength.length; i++)  
            elapsedTime[i] = test(alg, GenerateData.UNIFORM, dataLength[i], 0, 5);  
        for(int i=0;i<dataLength.length;i++)  
            System.out.printf("数据量2^%d,5次平均%6.4f%n ",i+8, elapsedTime[i]);  
    }  
}  

任务3

public class Test2 {  
    public static double time(SortAlgorithm alg, Double[] numbers){  
        double start = System.nanoTime();  
        alg.sort(numbers);  
        double end = System.nanoTime();  
        return end - start;  
    }  
    public static double test(SortAlgorithm alg, int dataProbabilityType, int dataLength, int k, int T)  
    {  
        double totalTime = 0;  
        Double[] numbers = null;  
        for(int i = 0; i < T; i++) {  
            switch(dataProbabilityType){  
                case GenerateData.UNIFORM -> numbers = GenerateData.getRandomData(dataLength);  
                case GenerateData.KSORTED -> numbers = GenerateData.getKSortedData(dataLength, k);  
            }  
            totalTime += time(alg, numbers);  
        }  
        return totalTime/T;  
    }  
    public static void main(String[] args) {  
        int[] dataLength = {256,512,1024,2048,4096,8192,16384,32768,65536};  
        double[] elapsedTime = new double[dataLength.length];  
        SortAlgorithm alg = new Insertion();  
        System.out.println("这是Insertion测试:");  
        for(int i = 0; i < dataLength.length; i++)  
            elapsedTime[i] = test(alg, GenerateData.KSORTED, dataLength[i], 5, 5);  
        for(int i=0;i<dataLength.length;i++)  
            System.out.printf("数据量2^%d,5次平均%6.4f%n ",i+8, elapsedTime[i]);  
        alg = new Shell();  
        System.out.println("这是Shell测试:");  
        for(int i = 0; i < dataLength.length; i++)  
            elapsedTime[i] = test(alg, GenerateData.KSORTED, dataLength[i], 5, 5);  
        for(int i=0;i<dataLength.length;i++)  
            System.out.printf("数据量2^%d,5次平均%6.4f%n ",i+8, elapsedTime[i]);  
        alg = new Quicksort();  
        System.out.println("这是Quicksort测试:");  
        for(int i = 0; i < dataLength.length; i++)  
            elapsedTime[i] = test(alg, GenerateData.KSORTED, dataLength[i], 5, 5);  
        for(int i=0;i<dataLength.length;i++)  
            System.out.printf("数据量2^%d,5次平均%6.4f%n ",i+8, elapsedTime[i]);  
        alg = new Selection();  
        System.out.println("这是Selection测试:");  
        for(int i = 0; i < dataLength.length; i++)  
            elapsedTime[i] = test(alg, GenerateData.KSORTED, dataLength[i], 5, 5);  
        for(int i=0;i<dataLength.length;i++)  
            System.out.printf("数据量2^%d,5次平均%6.4f%n ",i+8, elapsedTime[i]);  
        alg = new Mergesort();  
        System.out.println("这是Mergesort测试:");  
        for(int i = 0; i < dataLength.length; i++)  
            elapsedTime[i] = test(alg, GenerateData.KSORTED, dataLength[i], 5, 5);  
        for(int i=0;i<dataLength.length;i++)  
            System.out.printf("数据量2^%d,5次平均%6.4f%n ",i+8, elapsedTime[i]);  
    }  
}  

任务4

public static final int RANDOM = 3;  
    public static Double[] getRandomData2(int N){  
        Double[] numbers = new Double[N];  
        for(int i = 0; i < N/2; i++)  
            numbers[i] = 0.0;  
        for(int i = N/2; i < 3*N/4; i++)  
            numbers[i] = 1.0;  
        for(int i = 3*N/4; i < 7*N/8; i++)  
            numbers[i] = 2.0;  
        for(int i = 7*N/8; i < N; i++)  
            numbers[i] = 3.0;  
        shuffle(numbers,0, numbers.length-1);  
        return numbers;  
    }  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/760484.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS Next开发学习手册——单选框 (Radio)

Radio是单选框组件&#xff0c;通常用于提供相应的用户交互选择项&#xff0c;同一组的Radio中只有一个可以被选中。具体用法请参考 Radio 。 创建单选框 Radio通过调用接口来创建&#xff0c;接口调用形式如下&#xff1a; Radio(options: {value: string, group: string})…

Linux常用工具使用方式

目录 常用工具&#xff1a; 安装包管理工具&#xff1a; 查找含有关键字的软件包 安装软件 安装文件传输工具 安装编辑器 C语言编译器 C编译器 安装调试器 安装项目版本管理工具 cmake 卸载软件 安装jsoncpp 安装boost库 安装mariadb 安装tree&#xff08;让目录…

Python28-3 朴素贝叶斯分类算法

朴素贝叶斯算法简介 朴素贝叶斯&#xff08;Naive Bayes&#xff09;算法是一种基于贝叶斯定理的分类算法。它广泛应用于文本分类、垃圾邮件检测和情感分析等领域。该算法假设特征之间是独立的&#xff0c;这个假设在实际情况中可能并不完全成立&#xff0c;但Naive Bayes在许…

java笔记(30)——反射的 API 及其 使用

文章目录 反射1. 什么是反射2. 获取class字段&#xff08;字节码文件对象&#xff09;方式1方式2方式3应用 3. 获取构造方法和权限修饰符前期准备获取所有的公共构造方法获取所有的构造方法获取无参构造方法获取一个参数的构造方法获取一个参数的构造方法获取两个参数的构造方法…

Java面试题--JVM大厂篇之G1 GC的分区管理方式如何减少应用线程的影响

目录 引言: 正文: 1. 区域划分&#xff08;Region&#xff09; 2. 并行和并发回收 3. 区域优先回收&#xff08;Garbage First&#xff09; 4. 可预测的停顿时间 5. 分阶段回收 6. 复制和压缩 实际效果: 场景举例 1. 减少单次GC的影响 2. 支持高并发环境 3. 优…

数学建模(1):期末大乱炖

1 概述&#xff01;&#xff01; 1.1 原型和模型 原型&#xff1a;客观存在的研究对象称为原型&#xff0c;也称为“系统”、“过程”。 机械系统、电力系统、化学反应过程、生产销售过程等都是原型&#xff1b; 研究原型的结构和原理&#xff0c; 从而进行优化、预测、评价…

一区算法MPA|海洋捕食者算法原理及其代码实现(Matlab/Python))

Matlab/Python&#xff1a; 本文KAU将介绍一个2020年发表在1区期刊ESWA上的优化算法——海洋捕食者算法 (Marine Predators Algorithm&#xff0c;MPA)[1] 该算法由Faramarzi等于2020年提出&#xff0c;其灵感来源于海洋捕食者之间不同的觅食策略、最佳相遇概率策略、海洋记…

【MySQL】Linux下MySQL的目录结构、用户、权限与角色

一、Linux下MySQL的目录结构 1、MySQL相关目录 数据库文件存放路径&#xff1a;/var/lib/mysql数据库命令存放路径&#xff1a;/user/bin和/user/sbin配置文件目录&#xff1a;/usr/share/mysql-8.0/、/usr/share/mysql/和/etc/my.cnf 2、假设我们创建了一个数据库dbtest1&a…

使用evo工具比较ORB-SLAM3的运行轨迹(从安装到解决报错)

ORB-SLAM2和ORB-SLAM3怎么跑出来&#xff0c;之前都有相关的保姆级的教程&#xff0c;下来给大家介绍一款evo工具&#xff0c;给科研加速&#xff01;&#xff01;&#xff01; 文章目录 1.下载evo2.生成轨迹3.evo别的功能使用 1.下载evo 输入命令下载 pip install -i https…

你真的会udf提权???数据库权限到系统权限 内网学习 mysql的udf提权操作 ??msf你会用了吗???

我们在已经取得了数据库的账号密码过后&#xff0c;我们要进一步进行提取的操作&#xff0c;我们mysql有4钟提权的操作。 udf提权(最常用的)mof提权启动项提权反弹shell提权操作 怎么获取密码操作&#xff1a; 怎么获取密码&#xff0c;通过sql注入获取这个大家都应该知道了&a…

百强韧劲,进击新局 2023年度中国医药工业百强系列榜单发布

2024年&#xff0c;经济工作坚持稳中求进、以进促稳、先立后破等工作要求。医药健康行业以不懈进取的“韧劲”&#xff0c;立身破局&#xff0c;迎变启新。通过创新和迭代应对不确定性&#xff0c;进化韧性力量&#xff0c;坚持高质量发展&#xff0c;把握新时代经济和社会给予…

零基础开始学习鸿蒙开发-读书app简单的设计与开发

目录 1.首页设计 2.发现页面的设计 3.设置页面的设计 4.导航页设计 5.总结&#xff1a; 6.最终的效果 1.首页设计 Entry Component export struct home {State message: string 首页build() {Row() {Column() {Text(this.message).fontSize(50).fontWeight(FontWeight.B…

基于线调频小波变换的非平稳信号分析方法(MATLAB)

信号处理领域学者为了改进小波变换在各时频区间能量聚集性不高的缺点&#xff0c;有学者在小波分析基础上引入调频算子构成了线性调频小波变换&#xff0c;线调频小波一方面继承了小波变换的理论完善性&#xff0c;另一方面用一个新的参数&#xff08;线调频参数&#xff09;刻…

构建高效业财一体化管理体系

构建高效业财一体化管理体系 业财一体化战略意义 提升决策质量 强化数据支撑&#xff1a;通过整合业务与财务数据&#xff0c;为决策提供准确、实时的信息基础&#xff0c;确保分析的深度与广度。促进业务与财务协同&#xff1a;打破信息孤岛&#xff0c;实现业务流程与财务管…

Django 定义模型执行迁移

1&#xff0c;创建应用 Test/app8 python manage.py startapp app8 2&#xff0c;注册应用 Test/Test/settings.py 3&#xff0c;配置路由 Test/Test/urls.py from django.contrib import admin from django.urls import path, includeurlpatterns [path(app8/, include(a…

Linux服务器上安装CUDA11.2和对应的cuDNN 8.4.0

一、检查 检查本机是否有CUDA工具包&#xff0c;输入nvcc -V: 如图所示&#xff0c;服务器上有CUDA&#xff0c;但版本为9.1.85&#xff0c;版本过低&#xff0c;因此博主要重装一个新的。 二、安装CUDA 1.查看服务器最高支持的CUDA版本 在命令行输入nvidia-smi查看显卡驱动…

Mining Engineering First Aid Riding

4个最主要的日常技能&#xff1a;Mining 采矿 Engineering 工程 First Aid 急救 Riding 骑术 4个最主要的日常技能

C# 信号量的使用

学习来源&#xff1a;《.net core 底层入门》 第六章第9节&#xff1a;信号量 案例&#xff1a;主线程负责添加数据&#xff0c;子线程负责获取数据 使用SemaphoreSlim&#xff08;轻信号量&#xff09;实现&#xff1a; using System; using System.Collections.Generic; us…

AI写作变现指南:从项目启动到精通

项目启动 1. 确定目标客户群体 首先&#xff0c;明确谁是我们的目标客户。以下是一些潜在的客户群体&#xff1a; 大学生&#xff1a;他们需要写论文、报告、演讲稿等。 职场人士&#xff1a;包括需要撰写商业计划书、市场分析报告、项目提案等的专业人士。 自媒体从业者&…

TiDB-从0到1-BR工具

TiDB从0到1系列 TiDB-从0到1-体系结构TiDB-从0到1-分布式存储TiDB-从0到1-分布式事务TiDB-从0到1-MVCCTiDB-从0到1-部署篇TiDB-从0到1-配置篇TiDB-从0到1-集群扩缩容 一、BR工具 BR工具全称backup & restore&#xff0c;如同MySQL可以通过mysqldump和xtrabackup进行备份…