第一种:
改进后的选择排序 (以下图片摘自老师的课件)
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(~scanf("%d",&n)!=EOF)
{
int i,j,k,t,a[100];
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(i=1;i<=n;i++)
{
k=i;
for(j=i+1;j<=n;j++)
{
if(a[j]<a[k])
{
k=j;
}
}
if(k!=i)
{
t=a[k];
a[k]=a[i];
a[i]=t;
}
}
for(i=1;i<=n;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
return 0;
}
第二种:
改进后的冒泡排序(下方说明文字来自老师的课件)
冒泡排序–改进(理解)
1)当一次冒泡过程中发现没有交换操作时,表明序列已经排好序了,便终止冒泡操作。
2)标志变量 f:标记在比较过程中是否发生了数据交换。
3)在每趟比较前(外循环内),把 f 置为0,如果在这趟比较过程中发生了交换,将变量 f 置为1。
4)在一趟比较结束后判断:
如果 f 变量取值为 0,结束排序过程。
否则进行下一趟排序。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(~scanf("%d",&n)!=EOF)
{
int i,j,f,t,a[100];
for(i=1; i<=n; i++)
{
scanf("%d",&a[i]);
}
for(i=1; i<=n; i++)
{
f=0;
for(j=1; j<=n-i; j++)
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
f=1;
}
}
if(f==0)
break;
}
for(i=1; i<=n; i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
return 0;
}
PS:把下列n个字符串按照首字母的字典序排序
输入:
5
apple
banana
tree
soup
orange
输出:
apple
banana
orange
soup
tree
方法一:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int i,j,n;
scanf("%d",&n);
char a[100][100],c[100];
for(i=0; i<=n-1; i++)
{
scanf("%s",a[i]);
}
for(i=0; i<=n-1; i++)
{
for(j=i+1; j<=n-1; j++)
{
if(strcmp(a[i],a[j])>0)
{
strcpy(c,a[j]);
strcpy(a[j],a[i]);
strcpy(a[i],c);
}
}
}
for(i=0; i<=n-1; i++)
{
printf("%s\n",a[i]);
}
return 0;
}
方法二:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int i,j,n;
scanf("%d",&n);
char a[100][100],c[100];
for(i=0; i<=n-1; i++)
{
scanf("%s",a[i]);
}
for(i=0; i<=n-1; i++)
{
for(j=0; j<n-1-i; j++)
{
if(strcmp(a[j+1],a[j])<0)
{
strcpy(c,a[j]);
strcpy(a[j],a[j+1]);
strcpy(a[j+1],c);
}
}
}
for(i=0; i<=n-1; i++)
{
printf("%s\n",a[i]);
}
return 0;
}
训练反思:
冒泡冒的都快冒烟了