Posted on 2011-09-17 16:53
hoshelly 閱讀(350)
評論(0) 編輯 收藏 引用 所屬分類:
C
冒泡排序的基本概念:
依次比較相鄰的兩個數(shù),將小數(shù)放在前面,大數(shù)放在后面。即在第一趟:首先比較第1個和第2個數(shù),將小數(shù)放前,大數(shù)放后。然后比較第2個數(shù)和第3個數(shù),將小數(shù)放前,大數(shù)放后,如此繼續(xù),直至比較最后兩個數(shù),將小數(shù)放前,大數(shù)放后。至此第一趟結(jié)束,將最大的數(shù)放到了最后。在第二趟:仍從第一對數(shù)開始比較(因為可能由于第2個數(shù)和第3個數(shù)的交換,使得第1個數(shù)不再小于第2個數(shù)),將小數(shù)放前,大數(shù)放后,一直比較到倒數(shù)第二個數(shù)(倒數(shù)第一的位置上已經(jīng)是最大的),第二趟結(jié)束,在倒數(shù)第二的位置上得到一個新的最大數(shù)(其實在整個數(shù)列中是第二大的數(shù))。如此下去,重復(fù)以上過程,直至最終完成排序。需要用二重循環(huán)排序。
Example:
#include<stdio.h>
int main()


{
int i,j,temp,tag;
int a[11]; //數(shù)組第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;
}


以下是選擇排序法:
每次外循環(huán)先將定位元素的小標(biāo)i值記錄到K,認(rèn)為a[k]是最小值,第一輪比較時,若遇到比a[k]更小的數(shù),則交換兩數(shù)的下標(biāo),由下面的if語句進(jìn)行交換處理。
這樣第一輪就選出了最小的數(shù),第二輪,同理選出次小的數(shù)排在最小的數(shù)后面。如果是輸入10個數(shù),那么進(jìn)行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,改變了,則交換兩個數(shù)的位置
{
t=a[i];
a[i]=a[k];
a[k]=t;
}
}
for(i=0;i<10;i++)//最后輸出已經(jīng)排好序的數(shù)
printf("%5d",a[i]);
}
PS:大一剛開始接觸這兩個排序算法時,感覺有點亂,現(xiàn)在回過頭來仔細(xì)看,思路清晰了不少。時刻回顧過去的知識,進(jìn)行整理,再認(rèn)識,很重要呀。:-D