8----排序算法的各种详解

1.插入排序时间复杂度为O(n2)–最坏情况
插入排序原理很简单,讲一组数据分成两组,我分别将其称为有序组与待插入组。每次从待插入组中取出一个元素,与有序组的元素进行比较,并找到合适的位置,将该元素插到有序组当中。就这样,每次插入一个元素,有序组增加,待插入组减少。直到待插入组元素个数为0。当然,插入过程中涉及到了元素的移动。
为了排序方便,我们一般将数据第一个元素视为有序组,其他均为待插入组。

这里写图片描述

#include<cstdio>
#include<cstring>
#include<iostream>
#include<iomanip>
using namespace std;
int a[20]={2,4,1,8,9,10,34,23,12,67,45,32,7,99,456,76,43,54,19,70};
void sort()
{
    int t;
    for(int i=1;i<20;i++)
        for(int j=i-1;j>=0;j--)
    {
        if(a[j+1]<a[j])
        {
            t=a[j+1];
            a[j+1]=a[j];
            a[j]=t;
        }
        else break;
    }
}
int main()
{
sor();
for(int i=0;i<20;i++)
    cout<<setw(4)<<a[i];
return 0;
}

2.选择排序
若从大到小排列,每次选择剩余数中的最大的放在前面
时间复杂度为o(n2),

#include<cstdio>
#include<cstring>
#include<iostream>
#include<iomanip>
using namespace std;
int a[20]={2,4,1,8,9,10,34,23,12,67,45,32,7,99,456,76,43,54,19,70};
void sor()
{
    int t;
    for(int i=0;i<19;i++)
        for(int j=i+1;j<20;j++)
    {
        if(a[i]>a[j])
        {
            t=a[i];
            a[i]=a[j];
            a[j]=t;
        }
    }
}
int main()
{
sor();
for(int i=0;i<20;i++)
    cout<<setw(4)<<a[i];
return 0;
}

3.冒泡排序
每次交换相邻的两个数,直到哪一次一次也不交换为止,时间复杂度为O(n2)

#include<cstdio>
#include<cstring>
#include<iostream>
#include<iomanip>
using namespace std;
int a[20]= {2,4,1,8,9,10,34,23,12,67,45,32,7,99,456,76,43,54,19,70};
void sor()
{
    int t,flag;
    while(1)
    {
        flag=0;
        for(int i=0; i<19; i++)
            if(a[i]>a[i+1])
            {
                t=a[i];
                a[i]=a[i+1];
                a[i+1]=t;
                flag=1;
            }
        if(flag==0) break;
    }
}
int main()
{
    sor();
    for(int i=0; i<20; i++)
        cout<<setw(4)<<a[i];
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Nacht_one/article/details/82024123