Posted on 2011-09-17 16:53
hoshelly 閱讀(342)
評論(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