1. 程式人生 > >陣列排序(交換法與選擇法)

陣列排序(交換法與選擇法)

交換法與選擇法降序排序

交換法

交換法對陣列陣列進行排序的基本思路 就是先讓陣列(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]); } }

總結

選擇法建立在交換法之上,但因交換次數較少,故效率較高