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

 冒泡排序的基本概念:
依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第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












你可能感兴趣的:(冒泡排序与选择排序学习总结)