陣列排序(交換法與選擇法)
阿新 • • 發佈:2019-02-11
交換法與選擇法降序排序
交換法
交換法對陣列陣列進行排序的基本思路 就是先讓陣列(n個數)中的最左邊的一個數(用i=0代表)與其右邊的每一個數(從j=i+1開始)依次(j++)進行比較,若遇到比其大的數(score[j]>score[i]),則將較大的那個數的值賦給自己,自己成為較大數繼續與後面的數比較,以此類推,一輪後(即j=n時),讓i自增1,重複上述迴圈直至i=n-1.
下面以一個有5個數的陣列演示交換法排序:
#include <stdio.h>
void main()
{
int i,j,temp;
int score[5]={10,20,30 ,40,50};
int n=5;
for (i=0;i<=n-1;i++)
{
for (j=i+1;j<=n;j++)
{
if(score[j]>score[i])
{
temp=score[j];
score[j]=score[i];
score[i]=temp;
}
}
}
for(i=0;i<=n-1 ;i++)
{
printf("score[%d]= %d\n",i,score[i]);
}
}
選擇法
選擇法基本思路與交換法大致相似,不同點是交換法在一輪中要比較交換多次,而選擇法是一輪中比較多次,而最多交換一次。選擇法也是從i=0開始比較,遇到較大的數(score[j]>score[k](k在一開始是等於i的))則交換下標,最後若k 不等於i,則score[k]與score[i]交換位置。
同樣以上述的陣列用選擇法來排序:
#include <stdio.h>
void main()
{
int i,j,temp,k;
int score[5]={10,20,30,40,50};
int n=5;
for (i=0;i<=n-1;i++)
{
k=i;
for (j=i+1;j<=n;j++)
{
if (score[j]>score[k])
{
k=j;
}
}
if (k!=i)
{
temp=score[k];
score[k]=score[i];
score[i]=temp;
}
}
for(i=0;i<=n-1;i++)
{
printf("score[%d]= %d\n",i,score[i]);
}
}
總結
選擇法建立在交換法之上,但因交換次數較少,故效率較高