天之道

享受编程的乐趣。
posts - 118, comments - 7, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

冒泡排序与选择排序学习总结

Posted on 2011-09-17 16:53 hoshelly 阅读(319) 评论(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













只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理