選擇排序法(降序)
- 實例
int a[10]={6,3,42,23,35,71,98,67,56,38},i,j,t,n,max;
for(i=0;i<=8;i++)
{
max=i;
for(j=i+1;j<=9;j++)
{
if(a[max]<a[j])
{
n=j;
j=max;
max=n;
}
}
if(max!=i)
{
t=a[max];
a[max]=a[i];
a[i]=t;
}
}
for(i=0;i<=9;i++)
printf("%d ",a[i]);
>>>98 71 67 56 42 38 35 23 6 3
思路介紹
1.第一個循環(huán)讓一個變量讓它代表最大元素的索引,同時將此循環(huán)中的第一個元素的索引賦值給它。
2.在第二個循環(huán)中通過與別的元素進(jìn)行對比看看有沒有別的元素值比它還大,如果有讓它們的索引值進(jìn)行交換,一直對比到最后一個元素。
3.在第二循環(huán)結(jié)束后看看最大元素的索引顯示真的是第一個元素嗎?如果不是,讓第一個元素與最大元素的索引值交換。-
細(xì)節(jié)問題
兩次for循環(huán)中,變量的范圍不僅各有不同,而且還需要額外一個變量記錄,需要注意。第一個循環(huán)中變量i的范圍:它負(fù)責(zé)成為需要被進(jìn)行對比的第一個元素。
(只用比較到總元素數(shù)-1,因為前面的數(shù)值大都已經(jīng)挑選出來,最后一個數(shù)必定是最小的,不需要進(jìn)行比較,索引<=8)第二個循環(huán)中變量j的范圍:它負(fù)責(zé)成為數(shù)組中除第一個數(shù)外所有需要對比的其他數(shù)。
(因為i為第一個數(shù),起始的范圍就直接為i+1即可,結(jié)束到最后一個數(shù),索引<=9)我個人覺得這個交換法的理解難點就在于它是用最大元素的索引,而不是直接使用元素。而這么做的原因是在于如果直接使用元素,在第二個循環(huán)中,因為后面的元素值大概率會比第一個元素值大,而交換的過程中因為第一個元素其實并不是a[0]而是變量max。這樣就會讓數(shù)組中出現(xiàn)兩個“第一個元素”,這樣無疑就導(dǎo)致了程序的失敗。
冒泡法(降序)
- 實例
int a[10]={6,3,42,23,35,71,98,67,56,38},i,t,j;
for(i=0;i<=8;i++)
{
for(j=0;j<=8-i;j++)
{
if(a[j]<a[j+1])
{
t=a[j+1];
a[j+1]=a[j];
a[j]=t;
}
}
}
for(i=0;i<=9;i++)
printf("%d ",a[i]);
>>>98 71 67 56 42 38 35 23 6 3
思路介紹
1.首先對比第一個和第二個元素值,若第一個元素比第二個元素值小,交換兩個的位置;再繼續(xù)比較第二個元素和第三個元素值,這個過程中保持最小的元素值始終放在后。
2.直到倒數(shù)第二個元素和倒數(shù)第一個數(shù)對比完成,此時最小的數(shù)就被選擇交換出來,處于最后的位置,一輪冒泡結(jié)束。
3.因為最小的數(shù)已經(jīng)被安置在最后,下一輪的冒泡只用在第一個元素和倒數(shù)第二個數(shù)之間進(jìn)行。
4.重復(fù)1~2的過程,直到循環(huán)結(jié)束。-
細(xì)節(jié)問題
兩次for循環(huán)中,變量的范圍各有不同,這里解釋一下。第一個循環(huán)中變量i的范圍:負(fù)責(zé)控制一共要交換幾次?
(最后一個數(shù)不需要比較:對比9次,索引<=8)第二個循環(huán)中變量j的范圍:負(fù)責(zé)控制一次中的具體操作。
(在下一個循環(huán)中,具體要交換幾次,進(jìn)行幾次冒泡的過程:對比9-i次,索引<=8-i)
深刻理解第二次循環(huán)的具體作用:我們不是要找到它,而是要轉(zhuǎn)換它,讓最小的數(shù)安置于最后方,這點很重要。