加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 难以理解的简单递归排序算法

发布时间:2020-12-16 09:49:23 所属栏目:百科 来源:网络整理
导读:#include iostream#include algorithmusing namespace std;const int N = 100000;void sort(int* a,int lo,int hi){ int i = lo; if (lo = hi) return; for (int j = hi,mode = 1; i j; mode 0 ? j-- : i++) if (a[i] a[j]) { swap(a[i],a[j]); mode = -mode
#include <iostream>
#include <algorithm>
using namespace std;

const int N = 100000;
void sort(int* a,int lo,int hi)
{
    int i = lo;
    if (lo >= hi)
        return;
    for (int j = hi,mode = 1; i < j; mode > 0 ? j-- : i++)
        if (a[i] > a[j])
        {           
            swap(a[i],a[j]);
            mode = -mode;            
        }
    sort(a,lo,i - 1); 
    sort(a,i + 1,hi);
}
bool check(int* a)
{
    for (int i = 1; i < N; i++)
        if (a[i] < a[i - 1])
            return false;
    return true;
}
int main()
{
    int a[N];
    for (int i = 0; i < N; i++)
        a[i] = (i * 17 + 107) % 10;
    sort(a,N - 1);
    cout << (check(a) ? "correct" : "incorrect") << endl;
    return 0;
}

我找到了这种排序算法,但经过长时间的尝试理解它我不能.它看起来非常简单和简短.我认为可以通过不变来证明[lo:i]的任何元素都小于[j:hi]的任何元素但是我无法证明该语句在每次循环迭代后都成立(在j-之后) – 或者我).

解决方法

它是 quicksort的修改版本,第一个元素作为支点.

该算法基本上执行以下操作:

它有两个指针,我从0开始,j从长度-1开始.

它一直在减少j直到[j]<一个[i]中.在这一点上,它交换了他们的价值观.在此之后,j保持在该值,并且我再次开始递增,直到[j]<一个[i]中.此时它再次交换它们的值,现在j再次开始递减. 因此,如果你看到,每个比较都是用第一个元素完成的.循环结束后,第一个元素在正确的位置上升.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读