冒泡排序
选择排序
插入排序
最笨的排序方法 O(n2) 比较n(n-1)/2,移动次数超级多 最坏3(n2)/2
类似于水的冒泡,不断变换位置将需要的依次冒上来
//升序排列
void maopao()
{
int t;
for(int i=0;i<n;i++)
for(int j=0;j<n-i-1;i++)
{
if(a[j]>a[j+1])
{
t=a[j+1];
a[j+1]=a[j];
a[j]=t;
}
}
}
void maopao()
{
int t;
for(int i=0;i<n;i++)
for(int j=0;j<n-i-1;i++)
{
if(a[j]>a[j+1])
{
t=a[j+1];
a[j+1]=a[j];
a[j]=t;
}
}
}
选择排序
升序:依次选择最大的与最后一个位置互换 O(n2) 比较n(n-1)/2 移动3(n-1)
//升序排列
void xuanze()
{
int t;//记录位置
int k;
for(int i=n-1;i>0;i--)
{
t=0;
for(int j=1;j<i+1;i++)
{
if(a[t]<a[j])
t=j;
}
k=a[i];
a[i]=a[t];
a[t]=k;
}
}
void xuanze()
{
int t;//记录位置
int k;
for(int i=n-1;i>0;i--)
{
t=0;
for(int j=1;j<i+1;i++)
{
if(a[t]<a[j])
t=j;
}
k=a[i];
a[i]=a[t];
a[t]=k;
}
}
插入排序
O(n2) 最坏比较n(n-1)/2 最好比较 n-1 故(n2)/4 在排序个数较小的时候(一般小于16)优于O(nlogn)复杂度算法
相比选择排序的优点在于利用了排好的有序队列
//升序排列
void insertion_sort(int array[],int first,int last)
{
int i,j;
int temp;
for(i=first+1;i<=last;i++)
{
temp=array[i];
j=i-1;
//与已排序的数逐一比较,大于temp时,该数移后
while((j>=0)&&(array[j]>temp))
{
array[j+1]=array[j];
j--;
}
//存在大于temp的数
if(j!=i-1)
{array[j+1]=temp;}
}
}
void insertion_sort(int array[],int first,int last)
{
int i,j;
int temp;
for(i=first+1;i<=last;i++)
{
temp=array[i];
j=i-1;
//与已排序的数逐一比较,大于temp时,该数移后
while((j>=0)&&(array[j]>temp))
{
array[j+1]=array[j];
j--;
}
//存在大于temp的数
if(j!=i-1)
{array[j+1]=temp;}
}
}
后记:还存在一种对插入排序的改写,希尔排序,但在小时没有改善,大时就不用O(n2)复杂度的方法了,所以没啥用