三种排序方法:冒泡排序,选择排序,sort函数排序。
引言:为什么要写呢?因为我怕我忘了,一个寒假过去冒泡排序都不会手写了。
其中的冒泡排序和选择排序为C语言实现,而sort函数排序则借助C++实现,并且还可以用sort函数对结构体进行排序。
-
冒泡排序:
原理:
思路: 设置两个双重循环,第一重循环表示每一次的冒泡次数,即第一个最大值冒泡需要n次比较,第二个最大值需要n-1次比较,以此类推,第二重循环表示相互比较的过程,并根据大小进行交换,当结束循环后,则该数组按照从大到小或者从小到大依次排好,但是由于设置了双重循环,时间复杂度为N*N。
代码:
#include <stdio.h>
void bouble(int a[],int n)
{
int i,j,tmp;
for(i=0;i<n;i++)
{
for(j=0;j<n-i-1;j++)
{
if(a[j+1]>a[j])
{
tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
}
}
}
int main()
{
int i,j,a[20];
for(i=0;i<10;i++)
scanf("%d",&a[i]);
bouble(a,10);
for(i=0;i<10;i++)
printf("%d ",a[i]);
return 0;
}
/*45 39 22 8 35 14 7 40 32 19*/
/*39 45 22 8 35 14 7 40 32 19*/
-
选择排序:
原理: 1.从第一个元素出发到最后一个元素,找到其中的最大值或者最小值,然后将它和第一个元素交换,再从第二个元素出发到最后一个,找到其中的最大值或者最小值,然后将它和第二个元素交换,以此类推,当进行完一次遍历的时候,排序就会完成。
**思路:**首先设置一个for循环代表交换次数也充当被交换的节点,再设置一个循环用于遍历查找最大值或者最小值,内层循环没结束一次,就进行一次交换,当两层循环结束,就完成了排序过程。选择排序的时间复杂度为N*N。
代码:
#include <stdio.h>
void choose(int a[],int n)
{
int i,j,tmp;
int ad=0,maxx=a[ad];//ad用于存放最大值的下标,maxx用于找到存放最大值。
for(i=0;i<n-1;i++)
{
ad=i;maxx=a[ad];
for(j=i+1;j<n;j++)
{
if(a[j]>maxx)
{
maxx=a[j];
ad=j;
}
}
tmp=a[i];
a[i]=a[ad];
a[ad]=tmp;
ad=0;maxx=-1;
}
}
int main()
{
int i,j,a[20];
for(i=0;i<10;i++)
scanf("%d",&a[i]);
choose(a,10);
for(i=0;i<10;i++)
printf("%d ",a[i]);
return 0;
}
/*45 39 22 8 35 14 7 40 32 19*/
/*39 45 22 8 35 14 7 40 32 19*/
- *sort函数排序:
介绍:sort()是一个C++库中自带的排序函数,其根源是cmp()函数,使用sort()函数排序时,时间复杂度为:n*log2(n)。
数组用法: 一共有两种一种是从小到大排序,一种是从大到小排序,默认是从小到大排序。
sort(a,a+n)//默认从小到大
sort(a,a+n,less<进行排序的数据类型>());//从小到大
sort(a,a+n,greater<进行排序的数据类型>());//从大到小
结构体的用法: 需要自己写一个bool类型的cmp函数,在函数内部定义需要如何对结构体进行排序。
步骤: 首先,我们定义一个结构体,然后写一个bool型cmp的排序函数,再在主函数中用sort(vis,vis+n,cmp)即可。
代码:
struct node
{
int x;
int y;
}vis[10];
bool cmp(node s1,node s2)
{
return s1.x>s2.x;//根据x的大小从小到大进行排序
}
int main()
{
sort(vis,vis+n,cmp);
return 0;
}