荷兰的国旗是由红、白、蓝三种,问题为时间复杂度为o(n)的情况下,按颜色依次排为红、白、蓝三种。
代码的逻辑如下,并不复杂,所占用的空间复杂度为o(1)
int *Test::Sort(int *k, int counts)
{
int j = 0, i = 0,n=counts-1;
while (j<=n)
{
switch (k[j])
{
case 0:
swap(k[i], k[j]);
i++; j++;
break;
case 1:
j++;
break;
case 2:
swap(k[j], k[n]);
n--;
break;
}
}
return k;
}
红白蓝三种情况,如果再考虑一次的话其实是对应的大于、小于和等于三种情况。可以用这种方法实现对快排的改版,挑选出比关键字大的和小的数,分别放在左边和右边。但是相比快速排序partition方法,不易找出初始值,(这里的查找方法逻辑比较杂,通过判断两个数是否是需要交换的数,是的话则重新对关键字赋值。其实比较逻辑可以放在swap方法中,这里就不在赘述了。)
int *Test::Compare_Sort(int *k,int low,int high)
{
int j = 0, i = 0, n = high;
int keys=low;
int index = k[low]; int values;
while (j <= n)
{