一、冒泡排序(两个相邻的元素进行比较)
题目描述
本题要求将给定的n个整数从小到大排序后输出。(利用冒泡法进行排序)
输入:第一行给出一个不超过10的正整数n。第二行给出n个整数,其间以空格分隔。
输出:在一行中输出从小到大有序的数列,相邻数字间有一个空格,行末不得有多余空格。
输入样例:
5
3 5 6 1 2
输出样例:
1 2 3 5 6
完整代码如下
#include<stdio.h>
int a[15];
int main()
{
int n,i,j,t;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n-1;i++)//n个数,n-1趟
{
for(j=0;j<n-i-1;j++)//次数
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
for(i=0;i<n-1;i++)
printf("%d ",a[i]);
printf("%d",a[n-1]);
return 0;
}
二、选择排序(当前的数和后面所有的数比较)
普通:
#include<stdio.h>
int a[15];
int main()
{
int n,i,j,t;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n-1;i++)//n个数,n-1趟
{
for(j=i+1;j<n;j++)//次数
{
if(a[i]>a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
for(i=0;i<n-1;i++)
printf("%d ",a[i]);
printf("%d",a[n-1]);
return 0;
}
优化:
#include<stdio.h>
int a[14];
int main()
{
int n,i,j,t,min;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n-1;i++)
{
min=i;
for(j=i+1;j<n;j++)
{
if(a[min]>a[j])
min=j;
}
if(i!=min)
{
t=a[i];
a[i]=a[min];
a[min]=t;
}
}
for(i=0;i<n-1;i++)
{
printf("%d ",a[i]);
}
printf("%d",a[n-1]);
return 0;
}
ps:例如【5 4 3 2 1】,3的位置没必要动
三、sort排序
一般形式:sort(start,end,排序方法)
头文件:#include<algorithm>
默认升序:
#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
int a[15];
int main()
{
int n,i;
cin>>n;
for(i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);//注意
for(i=0;i<n-1;i++)
cout<<a[i]<<" ";
cout<<a[n-1]<<endl;;
return 0;
}
降序:
#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
int a[15];
bool cmp(int x,int y)
{
return x>y;
}
int main()
{
int n,i;
cin>>n;
for(i=0;i<n;i++)
cin>>a[i];
sort(a,a+n,cmp);//注意
for(i=0;i<n-1;i++)
cout<<a[i]<<" ";
cout<<a[n-1]<<endl;;
return 0;
}
ps:如果数组下标从1开始:
升序:sort(a+1,a+1+n)
降序:sort(a+1,a+1+n,cmp)
sort排序也还有其他用途~~~