Posted on 2011-09-17 16:53
hoshelly 阅读(329)
评论(0) 编辑 收藏 引用 所属分类:
C
冒泡排序的基本概念:
依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。需要用二重循环排序。
Example:
#include<stdio.h>
int main()
{
int i,j,temp,tag;
int a[11]; //数组第0位空出
for(i=1;i<=10;i++)
scanf ("%d,",&a[i]);
for(j=1;j<=10;j++)
{
tag=1;
for (i=1;i<=10-j;i++)
{
if (a[i]>a[i+1])
{
temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
tag=0;
}
}
if(1==tag)
{
break;
}
}
for(i=0;i<10;i++)
printf("%5d",a[i]);
return 0;
}
以下是选择排序法:
每次外循环先将定位元素的小标i值记录到K,认为a[k]是最小值,第一轮比较时,若遇到比a[k]更小的数,则交换两数的下标,由下面的if语句进行交换处理。
这样第一轮就选出了最小的数,第二轮,同理选出次小的数排在最小的数后面。如果是输入10个数,那么进行9轮排序后就可完成整个排序过程。
#include<stdio.h>//选择排序法
void main()
{
int i,j,t,a[10],k;
printf("input 10 numbers:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<9;i++)//这里也要注意i=0;i<9;
{
k=i;
for(j=i+1;j<10;j++)
if(a[k]>a[j])
k=j;
if(k!=i)//如果k不等于i,改变了,则交换两个数的位置
{
t=a[i];
a[i]=a[k];
a[k]=t;
}
}
for(i=0;i<10;i++)//最后输出已经排好序的数
printf("%5d",a[i]);
}
PS:大一刚开始接触这两个排序算法时,感觉有点乱,现在回过头来仔细看,思路清晰了不少。时刻回顾过去的知识,进行整理,再认识,很重要呀。:-D