八大排序算法(C++实现)

八大排序算法指的是冒泡排序、选择排序、插入排序、希尔排序、堆排序、归并排序、快速排序和基数排序(本文没有)。关于八种排序方法的对比在下表中:

指标 冒泡排序 选择排序 插入排序 希尔排序
时间复杂度 O(n²) O(n²) O(n²) O(n^1.5)
空间复杂度 O(1) O(1) O(1) O(1)
稳定性 稳定 不稳定 稳定 不稳定
指标 堆排序 归并排序 快速排序 基数排序
时间复杂度 O(nlogn) O(nlogn) O(nlogn) O(d*(r+n))
空间复杂度 O(1) O(n) O(logn) O(rd+n)
稳定性 不稳定 稳定 不稳定 稳定

0、主函数统一采用:

#include <vector>
#include <iostream>
using namespace std;
int main()
{
    int a[]={3,1,6,8,12,2,5,7};
    int len=sizeof(a)/4;
    vector<int> arr(a,a+len);
    Solution sl;
    arr = sl.guibing(arr); // 快排的参数传入略有不同
    return 0;
}

1、冒泡排序:

class Solution{
public:
    // 冒泡排序,每次最大的沉底
    vector<int> MaoPao(vector<int> arr)
    {
        int len=arr.size();       
        for(int i=0;i<len;i++)
        {
            for(int j=1;j<len-i;j++)
            {
                if(arr[j-1]>arr[j])
                {
                    int temp=arr[j];
                    arr[j]=arr[j-1];
                    arr[j-1]=temp;
                }
            }
        }
        return arr;
    }
};

2、选择排序

class Solution{
public:
    // 选择排序,每次选择最小的出来放前面
    vector<int> Select(vector<int> arr)
    {
        int len=arr.size();
        for(int i=0;i<len;i++)
        {
            int min_num=i;
            for(int j=i;j<len;j++)
            {
                if(arr[j]<arr[min_num])
                    min_num=j;
            }
            int temp=arr[min_num];
            arr[min_num]=arr[i];
            arr[i]=temp;
        }
        return arr;
    }
};

3、插入排序

class Solution{
public:
    // 插入排序,依次把每个数字插入到正确的相对位置
    vector<int> Insert(vector<int> arr)
    {
        int len=arr.size();
        for(int i=1;i<len;i++)
        {
            int ins=arr[i],j;
            // 找ins该在的位置,并把大于它的后移
            for(j=i-1;j>=0;j--)
            {
                if(arr[j]>ins)
                    arr[j+1]=arr[j];
                else
                    break;
                
            }
            // 位置j的数小于ins,ins应该放在j+1的位置
            arr[j+1]=ins;
        }
        return arr;
    }
};

4、希尔排序

class Solution{
public:
    // 希尔排序,插入排序的改进版本
    vector<int> Shell(vector<int> arr)
    {
        int len=arr.size();
        int a[]={3,1};
        vector<int> sh(a,a+2);
        for(int it=0;it<sh.size();it++)
        {
            int gap=sh[it];
            // 后面的双循环等同于插入排序,把+1和-1都改成了+gap/-gap
            for(int i=gap;i<len;i+=gap)
            {
                int ins=arr[i],j;
                for(j=i-gap;j>=0;j-=gap)    // 这里如果再int j,不报错但会出大问题
                {
                    if(arr[j]>ins)
                        arr[j+gap]=arr[j];
                    else
                        break;
                    
                }
                arr[j+gap]=ins;
            }
        }
        return arr;
    }
};

5、堆排序

class Solution{
public:
    vector<int> Adjust(vector<int> arr,int start,int end)
    {
        int temp=arr[start];
        for(int i=2*start+1;i<=end;i=2*i+1)
        {
            if(i<end && arr[i]<arr[i+1])
                i++;
            if(arr[i]>temp)
            {
                arr[start]=arr[i];
                start=i;
            }
            else
                break;
        }
        arr[start]=temp;
        return arr;
    }
    vector<int> Heap_sort(vector<int> arr)
    {
        int len=arr.size();
        for(int i=len/2-1;i>=0;i--)
        {
            arr = Adjust(arr,i,len-1);
        }
        for(int i=0;i<len;i++)
        {
            int temp=arr[0];
            arr[0]=arr[len-1-i];
            arr[len-1-i]=temp;
            arr = Adjust(arr,0,len-2-i);
        }
        return arr;
    }
};

6、快速排序

class Solution{
public:
    vector<int> Quick_Sort(vector<int> arr,int low,int high)
    {
        int i=low,j=high,key=arr[low];
        if(low>=high)
            return arr;
        while(low<high)
        {
            while(low<high && key<=arr[high])
                high--;
            if(key>arr[high])
            {
                arr[low]=arr[high];
                low++;
            }
            while(low<high && key>=arr[low])
                low++;
            if(key<arr[low])
            {
                arr[high]=arr[low];
                high--;
            }
        }
        arr[low]=key;
        arr = Quick_Sort(arr,i,low-1);
        arr = Quick_Sort(arr,low+1,j);
        return arr;
    }
};

7、归并排序

class Solution{
public:
    vector<int> guibing(vector<int> arr)
    {
        int len=arr.size();
        // gap:每次归并的长度
        for(int gap=1;gap<len;gap*=2)
        {
            vector<int> brr;
            int s1=0,e1=s1+gap-1,s2=e1+1,e2; // 每两段归并的首尾位置,并不断更新
            if(s2+gap-1<len-1)
                e2=s2+gap-1;
            else
                e2=len-1;
            while(s2<len)
            {
                while(s1<=e1 && s2<=e2)
                {
                    if(arr[s1]<arr[s2])
                        brr.push_back(arr[s1++]);
                    else
                        brr.push_back(arr[s2++]);
                }
                while(s1<=e1)
                    brr.push_back(arr[s1++]);
                while(s2<=e2)
                    brr.push_back(arr[s2++]);
                s1=e2+1;
                e1=s1+gap-1;
                s2=e1+1;
                if(s2+gap-1<len-1)
                    e2=s2+gap-1;
                else
                    e2=len-1;
            }
            while(s1<len)
                brr.push_back(arr[s1++]);
            for(int i=0;i<len;i++)
                arr[i]=brr[i];
            brr.clear();
        }
        return arr;
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355