#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, 0, N - 1);
cout << (check(a) ? "correct" : "incorrect") << endl;
return 0;
}
我找到了这种排序算法,但经过长时间的尝试理解它我不能。它看起来非常简单和简短。我认为可以通过不变来证明a[lo:i]
的任何元素都小于a[j:hi]
的任何元素但我无法证明该语句在每次循环迭代后都成立(在{{1}之后}或j--
)。
答案 0 :(得分:7)
它是quicksort的修改版本,第一个元素为枢轴。
该算法基本上执行以下操作:
它有两个指针,i
从0
开始,j
从length-1
开始。
它不断递减j
直到a[j] < a[i]
。在这一点上,它交换了他们的价值观
在此之后,j
保持该值,i
再次开始递增,直至a[j] < a[i]
。此时它再次交换它们的值,现在再次j
开始递减。
因此,如果你看到,每个比较都是用第一个元素完成的。循环结束后,第一个元素就会在正确的位置上升。