题解 | #排序# C++常用的七种排序算法

排序

http://www.nowcoder.com/practice/2baf799ea0594abd974d37139de27896

1.冒泡排序
   时间复杂度O(n^2)   空间复杂度O(1)  稳定
class Solution {
public:
    //冒泡排序
    void BubbleSort(vector<int>& a)
    {
        for(int i=0;i<a.size()-1;i++)
            for(int j=1;j<a.size()-i;j++)
                if(a[j-1]>a[j])
                    swap(a[j-1],a[j]);
    }
    vector<int> MySort(vector<int>& arr) {
        BubbleSort(arr);
        return arr;
    }
};
2.直接选择排序
   时间复杂度O(n^2)   空间复杂度O(1)  不稳定
class Solution {
public:
    //直接选择排序
    void SelectSort(vector<int>& a)
    {
        for(int i=0;i<a.size();i++)
        {
            int min=i;
            for(int j=i;j<a.size();j++)
                if(a[j]<a[min])
                    min=j;
            swap(a[i],a[min]);
        }
    }
    vector<int> MySort(vector<int>& arr) {
        SelectSort(arr);
        return arr;
    }
};
3.插入排序
   时间复杂度O(n^2)   空间复杂度O(1)  稳定
class Solution {
public:
    //插入排序
    void InsertSort(vector<int>& a)
    {
        for(int i=1;i<a.size();i++)
        {
            if(a[i]<a[i-1])
            {
                int tmp=a[i];
                int j=i;
                while(tmp<a[j-1])
                {
                    a[j]=a[j-1];
                    j--;
                }
                a[j]=tmp;
            }
        }
    }
    vector<int> MySort(vector<int>& arr) {
        InsertSort(arr);
        return arr;
    }
};
4.希尔排序
   时间复杂度O(n^1.3)   空间复杂度O(1)  不稳定
class Solution {
public:
    //Shell排序
    void ShellSort(vector<int>& a)
    {
        int h=1;
        while(h<a.size()/3)
            h=3*h+1;
        while(h>=1)
        {
            for(int i=h;i<a.size();i++)
                for(int j=i;j>=h&&a[j]<a[j-h];j-=h)
                    swap(a[j],a[j-h]);
            h/=3;
        }
    }
    vector<int> MySort(vector<int>& arr) {
        ShellSort(arr);
        return arr;
    }
};
5.快速排序
   时间复杂度O(nlogn)   空间复杂度O(nlogn)  不稳定
class Solution {
public:
    //快速排序
    void QuickSort(vector<int>& a,int l,int r)
    {
        if(l>=r) return;
        int i=l,j=r,temp=a[i];
        while(i<j)
        {
            while(i<j&&a[j]>=temp)
                j--;
            if(i<j)
            {
                a[i]=a[j];
                i++;
            }
            while(i<j&&a[i]<temp)
                i++;
            if(i<j)
            {
                a[j]=a[i];
                j--;
            }
        }
        a[i]=temp;
        QuickSort(a,l,i-1);
        QuickSort(a,i+1,r);
    }
    vector<int> MySort(vector<int>& arr) {
        QuickSort(arr,0,arr.size()-1);
        return arr;
    }
};
6.归并排序
   时间复杂度O(nlogn)   空间复杂度O(1)  稳定
class Solution {
public:
    //归并排序
    void Merge(vector<int>& a,int l,int r)
    {
        if(l>=r)
            return;
        int m=(l+r)/2;
        Merge(a,l,m);
        Merge(a,m+1,r);
        MergeSort(a,l,m,r);
    }
    void MergeSort(vector<int>& a,int l,int m,int r)
    {
        vector<int>temp;
        int left=l,right=m+1;
        while(left<=m&&right<=r)
            temp.emplace_back(a[left]<=a[right]?a[left++]:a[right++]);
        while(left<=m)
            temp.emplace_back(a[left++]);
        while(right<=r)
            temp.emplace_back(a[right++]);
        for(int j=0;j<temp.size();j++)
            a[l+j]=temp[j];
    }
    vector<int> MySort(vector<int>& arr) {
        Merge(arr,0,arr.size()-1);
        return arr;
    }
};
7.堆排序
   时间复杂度O(nlogn)   空间复杂度O(1)  不稳定
class Solution {
public:
    //堆排序
    void MaxHeapify(vector<int>& a,int start,int end)
    {
        int dad=start;
        int son=dad*2+1;
        while(son<=end)
        {
            if(son+1<=end&&a[son+1]>a[son])
                son++;
            if(a[dad]>a[son])
                return;
            else
            {
                swap(a[dad],a[son]);
                dad=son;
                son=dad*2+1;
            }
        }
    }
    void HeapSort(vector<int>& a)
    {
        for(int i=a.size()/2-1;i>=0;i--)
            MaxHeapify(a,i,a.size()-1);
        for(int i=a.size()-1;i>0;i--)
        {
            swap(a[0],a[i]);
            MaxHeapify(a,0,i-1);
        }
    }
    vector<int> MySort(vector<int>& arr) {
        HeapSort(arr);
        return arr;
    }
};


全部评论
道歉
点赞 回复 分享
发布于 2023-02-27 14:45 陕西
同学同花顺尝试一下吗,面试简单不造火箭,可全程保姆式跟进度,我帖子有内推
点赞 回复 分享
发布于 2022-09-24 13:11 浙江

相关推荐

大摆哥:刚好要做个聊天软件,直接让你帮他干活了
点赞 评论 收藏
分享
评论
13
13
分享

创作者周榜

更多
牛客网
牛客企业服务