排序算法(选择、冒泡、插入)

选择、冒泡、插入排序的时间复杂度都是O(N2)

选择排序

key:每一次都选出i位置后面最小的与i元素交换位置
一共比较N-2(i:0 ~ N-2)轮,每一轮j:i+1 ~ N-1
图片说明

class SelectionSort
{
public:
    void mySelectionSort(vector<int>& v)
    {
        if (v.size() < 2)
            return;
        for (int i = 0; i < v.size() - 1; i++)
        {
            int minIndex = i;
            for (int j = i + 1; j < v.size(); j++)
            {
                if (v[j] < v[minIndex])
                    minIndex=j;
            }
            mySwap(v, i, minIndex);
        }
    }
public:
    void mySwap(vector<int>& v, int i, int j)
    {
        int temp = v[i];
        v[i] = v[j];
        v[j] = temp;
    }

};

冒泡排序

key:谁大谁跑后面去,每一轮冒出来一个最大的(与选择排序的区别在于:相邻的比较,比完就换)
i:每次冒出来的位置;j:从0开始比较,一直比到i
图片说明

class BubbleSort
{
public:
    void myBubbleSort(vector<int> &v)
    {
        if (v.size() < 2)
            return;
        for (int i = v.size()-1; i > 0; i--)
        {
            for (int j = 0; j < i; j++)
            {
                if (v[j] > v[j + 1])
                    mySwap(v, j, j + 1);
            }
        }
    }
public:
    void mySwap(vector<int> &v, int i, int j)
    {
        int temp = v[i];
        v[i] = v[j];
        v[j] = temp;
    }
};

插入排序

key:依次让前面有序
每一轮(i:1~ N-1)都让0~ 1,0~ 2,...,0~ N-1有序;
i位置的元素,每一轮都依次与前面的元素比较,小就交换,直到不比前面的小或者到头了停下来(j:i~1)
图片说明

class InsertionSort
{
public:
    void myInsertionSort(vector<int> &v)
    {
        for (int i = 1; i < v.size(); i++)
        {
            for (int j = i; j > 0 && v[j] < v[j - 1]; j--)
            {
                mySwap(v, j, j - 1);
            }
        }
    }
public:
    void mySwap(vector<int>& v, int i, int j)
    {
        int temp = v[i];
        v[i] = v[j];
        v[j] = temp;
    }

};
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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