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

来源:互联网 发布:广州明动软件 知乎 编辑:程序博客网 时间:2024/05/02 01:12

    荷兰的国旗是由红、白、蓝三种,问题为时间复杂度为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)    {        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[n],  k[j]);                    keys = n;                }                else                {                    if (n == keys)                    {                        swap( k[n], k[j]);                        keys = j;                    }                }            }            if(n!=keys&&j!=keys) swap( k[j],  k[n]);              n--;        }}

实验结果显示该方法的效率和快排相差小。

0 0
原创粉丝点击