【发布时间】:2017-12-24 20:59:32
【问题描述】:
我编写了两个不同版本的冒泡排序算法 - bubbleSort,这是您在教科书中看到的算法的传统版本,以及 sortIntArray,它与 bubbleSort 非常相似,但它是递归的。
也许这是我的误解,但是后一种算法自称让我觉得算法的效率和冒泡排序是不一样的。如果有的话,有人可以向我解释一下这两者之间的区别吗?
private static int[] sortIntArray(int[] arr) {
for(int i=0; i<arr.length-1; i++) {
if(arr[i+1]<arr[i]) { // [i-2], [i-1], [i], [i+1], [i+2]
printArr(arr);
int temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
sortIntArray(arr);
}
}
return arr;
}
private static int[] bubbleSort(int[] arr) {
boolean swap = false;
while(!swap) {
swap = true;
for(int i = 0; i<arr.length-1; i++) {
if(arr[i+1]< arr[i]) {
printArr(arr);
swap = false;
int temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
}
}
return arr;
}
/**
* Returns an unordered integer array.
* @return
*/
private static int[] getIntArray() {
return new int[]{54, 899, 213, 2, 43, 8, 12, 11, 111, 43, 6, 44, 83, 3458};
}
【问题讨论】:
-
考虑到
boolean swap没有在递归版本中用于结束进程,它可能有不同的运行时间。但不是因为它本身是递归的 -
他们是一样的!
-
有一个证据表明您可以将每个递归论坛化为迭代,反之亦然。这不会改变算法的(理论)时间复杂度。
-
@Turing85 可以
-
递归版本为 O(n^3)。在标准冒泡排序中,可能存在 O(n^2) 交换。对于您找到的每个交换,在您的版本中,您从数组开始重新开始,添加 O(n) 次迭代。
标签: java algorithm sorting big-o