栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

快速排序:迭代或递归

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

快速排序:迭代或递归

就(渐近)时间复杂度而言,它们都是相同的。

“递归慢于迭代” –该语句背后的原因是由于递归堆栈的开销(在两次调用之间保存和恢复环境)。
但是-这些是固定数量的操作,而不会更改“迭代”的数量。

递归和迭代快速排序都是

O(nlogn)
普通情况
O(n^2)
最坏情况


编辑:

只是为了好玩,我运行了一个基准测试,并在文章中附加了(java)代码,然后运行了wilcoxon统计测试,以检查运行时间确实不同的概率是多少

结果是结论性的(P_VALUE = 2.6e-34,这意味着它们相同的概率是2.6 * 10 ^ -34-非常不可能)。但是答案不是您所期望的。
迭代解决方案的平均值为408.86 ms,而递归解决方案的平均值为236.81 ms

(注意-我使用了-

Integer
而不是
int
作为参数
recursiveQsort()
-否则递归会取得更好的效果,因为它不必装很多整数,这也很费时-
我这样做是因为迭代解决方案别无选择,这样做。

因此-您的假设是不正确的,递归解决方案比P_VALUE = 2.6e-34的迭代解决方案要快(至少对我的机器和Java而言)。

public static void recursiveQsort(int[] arr,Integer start, Integer end) {     if (end - start < 2) return; //stop clause    int p = start + ((end-start)/2);    p = partition(arr,p,start,end);    recursiveQsort(arr, start, p);    recursiveQsort(arr, p+1, end);}public static void iterativeQsort(int[] arr) {     Stack<Integer> stack = new Stack<Integer>();    stack.push(0);    stack.push(arr.length);    while (!stack.isEmpty()) {        int end = stack.pop();        int start = stack.pop();        if (end - start < 2) continue;        int p = start + ((end-start)/2);        p = partition(arr,p,start,end);        stack.push(p+1);        stack.push(end);        stack.push(start);        stack.push(p);    }}private static int partition(int[] arr, int p, int start, int end) {    int l = start;    int h = end - 2;    int piv = arr[p];    swap(arr,p,end-1);    while (l < h) {        if (arr[l] < piv) { l++;        } else if (arr[h] >= piv) {  h--;        } else {  swap(arr,l,h);        }    }    int idx = h;    if (arr[h] < piv) idx++;    swap(arr,end-1,idx);    return idx;}private static void swap(int[] arr, int i, int j) {     int temp = arr[i];    arr[i] = arr[j];    arr[j] = temp;}public static void main(String... args) throws Exception {    Random r = new Random(1);    int SIZE = 1000000;    int N = 100;    int[] arr = new int[SIZE];    int[] millisRecursive = new int[N];    int[] millisIterative = new int[N];    for (int t = 0; t < N; t++) {         for (int i = 0; i < SIZE; i++) {  arr[i] = r.nextInt(SIZE);        }        int[] tempArr = Arrays.copyOf(arr, arr.length);        long start = System.currentTimeMillis();        iterativeQsort(tempArr);        millisIterative[t] = (int)(System.currentTimeMillis()-start);        tempArr = Arrays.copyOf(arr, arr.length);        start = System.currentTimeMillis();        recursvieQsort(tempArr,0,arr.length);        millisRecursive[t] = (int)(System.currentTimeMillis()-start);    }    int sum = 0;    for (int x : millisRecursive) {        System.out.println(x);        sum += x;    }    System.out.println("end of recursive. AVG = " + ((double)sum)/millisRecursive.length);    sum = 0;    for (int x : millisIterative) {        System.out.println(x);        sum += x;    }    System.out.println("end of iterative. AVG = " + ((double)sum)/millisIterative.length);}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/383504.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号