2.1:初级排序算法

一:选择排序

每次选最小的与未排序的最前面那个交换一下:

class SelectionSort
{
public:
    static void exch(vector<int> &arr, int p, int q)
    {
        int temp = arr[p];
        arr[p] = arr[q];
        arr[q] = temp;
    }

    static void sort(vector<int> &arr)
    {
        int N = arr.size();
        vector<int> &yin = arr;
        for (int i = 0; i < N; ++i)
        {
            int min = i;
            //每次内循环确定一个min值,min为最小值的下标,注意是下标哦
            //用下标好处多多,直接用值的话,你还得确定min的初始值是多少
            for (int j = i + 1; j < N; ++j)
            {
                if (arr[j] < arr[min])
                {
                    min = j;
                }
            }
            exch(arr, i, min);
        }
    }
};
//O(T) = O(N^2); O(S) = O(1); 稳定排序

二:插入排序

摸牌,手上的牌已经有序了(在初始输入大致有序的情况下较快)

class InsertionSort
{
public:
    static void exch(vector<int> &arr, int p, int q)
    {
        int temp = arr[p];
        arr[p] = arr[q];
        arr[q] = temp;
    }

    static void sort(vector<int> &arr)
    {
        int N = arr.size();
        for (int i = 0; i < N; ++i)
        {
        //如果刚摸的牌arr[j]比手上最大的牌arr[j-1]小,则交换一下,继续比较
        //直到arr[j]到达合适位置(最小,或者刚好有牌小于等于它)
            for (int j = i; j>0 && arr[j] < arr[j - 1]; --j) 
            {
                exch(arr, j, j - 1);
            }
        }
    }
};
//O(T) = O(N^2); O(S) = O(1); 稳定排序

三:希尔排序

将插入排序的1换成h,并不断减少至1即可

class ShellSort
{
public:
    static void exch(vector<int> &arr, int p, int q)
    {
        int temp = arr[p];
        arr[p] = arr[q];
        arr[q] = temp;
    }

    static void sort(vector<int> &arr)
    {
        int N = arr.size();
        int h = 1;
        while (h < N / 3)
        {
            h = 3 * h + 1;
        }
        while (h >= 1)
        {
            for (int i = 0; i < N; ++i)
            {
                for (int j = i; j>0 && arr[j] < arr[j - 1]; --j)
                {
                    exch(arr, j, j - 1);
                }
            }
            h /= 3;
        }

    }
};
//h之间最好互质

复杂度跟h序列有关,至今没研究透彻

全部评论
插入排序比喻为打牌,666
点赞 回复 分享
发布于 2017-05-22 21:57

相关推荐

06-13 10:15
门头沟学院 Java
想去夏威夷的大西瓜在...:我也是27届,但是我现在研一下了啥项目都没有呀咋办,哎,简历不知道咋写
点赞 评论 收藏
分享
牛客刘北:如果暑期实习是27届的话,你要晚一年才会毕业,企业为什么会等你呢?要搞清时间逻辑呀!27届现在实习只能是在暑假实习,这是日常实习,不是暑期实习。所以多去投日常实习吧,暑期实习肯定不会要你的
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-07 11:20
点赞 评论 收藏
分享
评论
点赞
16
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务