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;
}