您的位置:首页 > 其它

荷兰国旗排序问题对应的快速排序方法

2015-07-12 17:42 447 查看
荷兰的国旗是由红、白、蓝三种,问题为时间复杂度为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--;
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)
    {
        values = k[j] - index;
        if (values < 0)
        {
            if (i == keys || j == keys)
            {
                if (j == keys)
                {
                    swap(k[i],k[j]);
                    keys = i;
                }
                else
                {
                    if (i == keys)
                    {
                        swap( k[i],  k[j]);
                        keys =j;
                    }
                }
            }
           if(j!=keys&&i!=keys) swap( k[i],  k[j]);
            i++; j++;
        }
        if (values == 0)
        {
            j++;
        }

        if (values>0)
        {
            if (j == keys||n==keys)
            {
                if (j == keys)
                {
                    swap( k
,  k[j]);
                    keys = n;
                }
                else
                {
                    if (n == keys)
                    {
                        swap( k
, k[j]);
                        keys = j;
                    }
                }
            }
            if(n!=keys&&j!=keys) swap( k[j],  k
);
              n--;
        }
}


实验结果显示该方法的效率和快排相差小。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: