liuyubobobo / Play-with-Algorithms

Codes of my MOOC Course <Play with Algorithms>, Both in C++ and Java language. Updated contents and practices are also included. 我在慕课网上的课程《算法与数据结构》示例代码,包括C++和Java版本。课程的更多更新内容及辅助练习也将逐步添加进这个代码仓。
3.67k stars 1.47k forks source link

关于第二章选择排序优化的问题 #31

Closed lllxxxhhhh closed 4 years ago

lllxxxhhhh commented 4 years ago

当我测试选择排序优化与为优化代码对比的时候,发现当数组元素在几百个的时候优化效果明显,当达到1000以上,多次测试基本优化代码运行时间都比未优化的时间长

int n = 2000;
Integer[] array = SortTestHelper.generateRandomArray(n, 0, 10000);
Integer[] copy = Arrays.copyOf(array, array.length);

SortTestHelper.testSort("com.lxh.sort.basic.SelectionSort", array);
SortTestHelper.testSort("com.lxh.sort.basic.SelectionSort2", copy);

运行结果基本保持在

SelectionSort : 9.2122ms
SelectionSort2 : 12.2485ms
lllxxxhhhh commented 4 years ago

原因发现在这里,注释的代码就是比没注释的那一段运行时间长

            for (int i = left + 1; i < right; i++) {
//                if (arr[i].compareTo(arr[minIndex]) < 0) {
//                    minIndex = i;
//                } else if (arr[i].compareTo(arr[maxIndex]) > 0) {
//                    maxIndex = i;
//                }
                if (arr[minIndex].compareTo(arr[i]) > 0) {
                    minIndex = i;
                } else if (arr[maxIndex].compareTo(arr[i]) < 0) {
                    maxIndex = i;
                }
            }
liuyubobobo commented 4 years ago

试一试让数据规模更大,测试结果在“秒”的级别而非“毫秒级别”,是否也是如此?

lllxxxhhhh commented 4 years ago

试一试让数据规模更大,测试结果在“秒”的级别而非“毫秒级别”,是否也是如此? 我使用了50000个数据,20次取得平均值 SelectionSort2比SelectionSort确实有优化,但是当两个for循环里边if判断写的顺序不一样的时候,测试结果差距还是不小的,刚刚评论说反了,注释的代码运行时间短

for (int i = left + 1; i < right; i++) {
if (arr[minIndex].compareTo(arr[i]) > 0) {
minIndex = i;
} else if (arr[maxIndex].compareTo(arr[i]) < 0) {
maxIndex = i;
}
}

当if语句这样判断的时候,运行结果是

SelectionSort 3.8320816150000008
SelectionSort2 3.581676555
for (int i = left + 1; i < right; i++) {
if (arr[i].compareTo(arr[minIndex]) < 0) {
minIndex = i;
} else if (arr[i].compareTo(arr[maxIndex]) > 0) {
maxIndex = i;
}
}

当if语句这样判断的时候,运行结果是

SelectionSort 3.7201685549999994
SelectionSort2 2.4815695550000005
liuyubobobo commented 4 years ago

我刚看到你说的是 selectionSort,一直以为是 InsertionSort。课程没有设置 selectionSort 的优化。你的实现也和我的实现完全不一样。我的实现不需要记录 maxIndex。

lllxxxhhhh commented 4 years ago

这个写法视频里没有,在源码里边的实现有,在这个路径下给出的02-Sorting-Basic\Course Code (Java)\Optional-01-Optimized-Selection-Sort ,里边的SelectionSort2 image

liuyubobobo commented 4 years ago

明白了 把问题放到问答区吧 我不在 github 下答疑。