zoukankan      html  css  js  c++  java
  • 算法之排序

    #ifndef _SORT_H_
    #define _SORT_H_
    
    template <typename T>
    void sort_bubble(T* p, int b, int e)
    {
        //for (int j = 0; j < 4; ++j)
        //{
        //    if (p[j + 1] < p[j])
        //    {
        //        T t = p[j];
        //        p[j] = p[j + 1];
        //        p[j + 1] = t;
        //    }
        //}
        //for (int j = 0; j < 3; ++j)
        //{
        //    if (p[j + 1] < p[j])
        //    {
        //        T t = p[j];
        //        p[j] = p[j + 1];
        //        p[j + 1] = t;
        //    }
        //}
        //for (int j = 0; j < 2; ++j)
        //{
        //    if (p[j + 1] < p[j])
        //    {
        //        T t = p[j];
        //        p[j] = p[j + 1];
        //        p[j + 1] = t;
        //    }
        //}
        //for (int j = 0; j < 1; ++j)
        //{
        //    if (p[j + 1] < p[j])
        //    {
        //        T t = p[j];
        //        p[j] = p[j + 1];
        //        p[j + 1] = t;
        //    }
        //}
    
        //上面的多个相同代码段可以用一个循环来包含
        //for (int i = 4; i > 0; --i)
        //{
        //    for (int j = 0; j < i; ++j)
        //    {
        //        if (p[j + 1] < p[j])
        //        {
        //            T t = p[j];
        //            p[j] = p[j + 1];
        //            p[j + 1] = t;
        //        }
        //    }
        //}
    
        //冒泡排序
        p += b; //让p指向要开始排序的位置
        for (int i = e - b; i > 0; --i)
        {
            for (int j = 0; j < i; ++j)
            {
                if (p[j + 1] < p[j])
                {
                    T t = p[j];
                    p[j] = p[j + 1];
                    p[j + 1] = t;
                }
            }
        }
    }
    
    //选择排序
    template <typename T>
    void sort_select(T* p, int b, int e)
    {
        //int j = 0;
        //for (int k = j + 1; k < 5; ++k)
        //{
        //    if (p[k] < p[j])
        //        j = k;
        //}
        //if (j != 0)
        //{
        //    T t = p[j];
        //    p[j] = p[0];
        //    p[0] = t;
        //}
        //int j = 1;
        //for (int k = j + 1; k < 5; ++k)
        //{
        //    if (p[k] < p[j])
        //        j = k;
        //}
        //if (j != 1)
        //{
        //    T t = p[j];
        //    p[j] = p[1];
        //    p[1] = t;
        //}
        //int j = 2;
        //for (int k = j + 1; k < 5; ++k)
        //{
        //    if (p[k] < p[j])
        //        j = k;
        //}
        //if (j != 2)
        //{
        //    T t = p[j];
        //    p[j] = p[2];
        //    p[2] = t;
        //}
        //int j = 3;
        //for (int k = j + 1; k < 5; ++k)
        //{
        //    if (p[k] < p[j])
        //        j = k;
        //}
        //if (j != 3)
        //{
        //    T t = p[j];
        //    p[j] = p[3];
        //    p[3] = t;
        //}
        
        //上面的多个相同代码段可以用一个循环来包含
        //for (int i = 0; i < 4; ++i)
        //{
        //    int j = i;
        //    for (int k = j + 1; k < 5; ++k)
        //    {
        //        if (p[k] < p[j])
        //            j = k;
        //    }
        //    if (j != i)
        //    {
        //        T t = p[j];
        //        p[j] = p[i];
        //        p[i] = t;
        //    }
        //}
    
        p += b;
        int num = e - b;
        for (int i = 0; i < num; ++i)
        {
            int j = i;
            for (int k = j + 1; k < num + 1; ++k)
            {
                if (p[k] < p[j])
                    j = k;
            }
            if (j != i)
            {
                T t = p[j];
                p[j] = p[i];
                p[i] = t;
            }
        }
    }
    
    //快速排序
    template <typename T>
    void sort_quick(T* p, int b, int e)
    {
        if (b < e)
        {
            //index就是依次放入比p[b]小的数据的下标
            int index = b;
            for (int i = b + 1; i <= e; ++i)
            {
                if (p[i] < p[b])
                {
                    index += 1;
                    if (index != i)
                    {
                        T t = p[i];
                        p[i] = p[index];
                        p[index] = t;
                    }
                }
            }
            if (index != b)
            {
                T t = p[b];
                p[b] = p[index];
                p[index] = t;
            }
    
            sort_quick(p, b, index - 1);
            sort_quick(p, index + 1, e);
        }
    }
    
    //归并 template
    <typename T> void sort_merge(T* p, int b, int e, T* h) { if (b < e) { int half = (b + e) / 2; sort_merge(p, b, half, h); sort_merge(p, half + 1, e, h); int i1 = b, i2 = half + 1, i3 = b; while (i1 <= half && i2 <= e) { if (p[i1] < p[i2]) h[i3++] = p[i1++]; else h[i3++] = p[i2++]; } while (i1 <= half) h[i3++] = p[i1++]; while (i2 <= e) h[i3++] = p[i2++]; //将辅助数组的数据传回给原数组 for (int i = b; i <= e; ++i) p[i] = h[i]; } } #endif
  • 相关阅读:
    机器学习算法优秀性:衡量指标
    MapReduce and Pregel
    K-d 树对聚类算法进行预处理
    论文中的算法描述 By 薛磊
    批判性思维《描述性假设》
    论文中的数学符号使用
    HOOK别人的dylib(HOOK cydia里面的插件)
    关于某听书软件的开通20年会员的心路历程
    Aspects 源码学习
    Undefined symbols for architecture arm64(其cpu架构)
  • 原文地址:https://www.cnblogs.com/Dean27/p/8516770.html
Copyright © 2011-2022 走看看