鱼C论坛

 找回密码
 立即注册
查看: 2545|回复: 1

簡單經過改編的排序算法,你的編譯器能通過嗎?

[复制链接]
发表于 2014-6-21 22:14:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 andalousie 于 2014-6-21 23:06 编辑

這個演算法是改編的STL的 std::sort的某個實現版本,快排已經改得不是快排了,但是,重要的是,你的編譯器能跟我一樣編譯正常嗎?據我多次嘗試,沒有幾個編譯器會正常。問題可能出在decltype上面,可是我用的有錯嗎?
這裏貼出代碼
//Quicksort_Experiment.cpp
//author: andalousie
#include <iostream>
#include <algorithm>

const int SORT_MAX = 16;

template<class Ty> inline
Ty median(Ty a, Ty b, Ty c)
{
        if (a < b)
                return (b < c ? b : a < c ? c : a);
        else
                return (a < c ? a : b < c ? c : b);
}

template<class BI, class T> inline
void unguarded_insert(BI i2, T v)
{
        for (BI scan = i2; v < *(--scan); i2 = scan)
                *i2 = *scan;
        *i2 = v;
}

template<class BI> inline
void insertion_sort(BI i1, BI i2)
{
        if (i1 == i2) return;
        for (BI scan = i1; ++scan != i2; )
        {
                decltype(*i1) v = *scan;
                if (!(v < *i1))
                        unguarded_insert(scan, v);
                else
                {
                        std::copy_backward(i1, scan, scan + 1);
                        *i1 = v;
                }
        }
}

template<class It, class T> inline
void unguarded_partition(It i1, It i2, T pivot)
{
        for (; ; ++i1)
        {
                for (; *i1 < pivot; ++i1);
                for (; pivot < *(--i2); );
                if (i2 < i1)
                        return;
                std::swap(*i1, *i2);
        }
}

template<class It> inline
void sort(It i1, It i2)
{
        if (i2 - i1 <= SORT_MAX)
                insertion_sort(i1, i2);
        else
        {
                int distance = i2 - i1;
                for (It s = i1, e; SORT_MAX < distance; )
                {
                        It save;
                        if (distance >= i2 - s) 
                                e = i2, distance >>= 1, save = i1;
                        else
                                e = s + distance, save = e;
                        unguarded_partition(s, e,
                                median(*s, *(s + (e - s) / 2), *(e - 1)));
                        s = save;
                }
                insertion_sort(i1, i1 + SORT_MAX);
                for (i1 += SORT_MAX; i1 != i2; ++i1)
                        unguarded_insert(i1, *i1);
        }
}

int main()
{
        int a[] = {1,2,4,3,5,7,0,2,6,4,33,765,345,234,252,23,64,34,54,6,5,3,645,254,234,5,23,25,422,432};
        sort(a, a+30);
        for (int i = 0; i < 30; ++i)
        std::cout << *(a+i) << " ";
}
QSExp.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-6-21 22:47:11 | 显示全部楼层
而且這個排序已經不快了。我一開始的目標是不用遞歸實現一下。現在還是有難度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-28 04:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表