排序算法总结

秋招手撕代码,最常见的就是排序算法。总结一下

一、冒泡排序

思路:假设数组长度为n,遍历数组n-1次,每次 遍历都能找出最大值,放于 末尾。

void Solution(vector<int> data)
{
    int i_length = data.size();
    for(int i = i_length - 1;i > 0;--i)
    {
        for(int j = 0;j<i;++j)
        {
            if(data[j] > data[j+1])
            {
                int temp = data[j];
                data[j] = data[j+1];
                data[j+1] = temp;
            }
        }
    }
}

冒泡排序优化:

void Solution(vector<int> data)
{
    int i_length = data.size();
    bool flag = true;
    for(int i = i_length - 1;i > 0 && flag;--i)
    {
        flag = false;
        for(int j = 0;j<i;++j)
        {            
            if(data[j] > data[j+1])
            {
                int temp = data[j];
                data[j] = data[j+1];
                data[j+1] = temp;
                flag = true;
            }
        }
    }
}

时间复杂度分析:

 

二、简单选择排序

思路:假设数组长度为n,遍历数组n-1次,每遍一次,找出一个最小值。

void Solution(vector<int> data)
{
    int i_length = data.size();
    for(int i = 0;i< i_length -1;++i)
    {
        int i_min = i;
        for(int j = i+1;j<i_length -1;++j)//先找到最小值位置,再进行交换,可提高性能。
        {
            if(data[j] < data[i_min])
                i_min = j;
        }

        if(i_min != i)
        {
            int temp = data[i];
            data[i] = data[i_min];
            data[i_min] = temp;    
        }
    }

}

 时间复杂度分析:

三、直接插入排序

思路:

void Solution(vector<int> data)
{
    int i_length = data.size();
    for(int i = 1;i< i_length -1;++i)
    {
        if(data[i] < data[i-1])
        {
            int temp = data[i];
            for(int j = i-1;data[j] > temp;--j)
            {
                data[j +1] = data[j];
            }
            data[j +1] = temp;
        }
    }
}

时间复杂度分析:

四、希尔排序

思路:

//该代码有问题!!!
void Solution(vector<int> data)
{
    int i_length = data.size();
    int i_enhance = i_length;

    do
    {  
        i_enhance = i_enhance/3 +1;
        for(int i = i_enhance;i< i_length -1;i++)
        {
            if(data[i] < data[i-i_enhance])
            {
                int temp = data[i];
                for(int j = i-i_enhance;data[j] > temp;j-= i_enhance)
                {
                    data[j +i_enhance] = data[j];
                }
                data[j + i_enhance] = temp;
             }
        }
    }
    while(i_enhance > 1);
}

五、快速排序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值