凜冬之翼---三種基礎排序演算法
阿新 • • 發佈:2018-12-31
這是今天第三篇部落格,藉著考試我再把三種基本的排序演算法再複習一遍,它們分別是1.插入排序演算法 2.交換排序演算法 3.選擇排序演算法
1.插入排序的思路是我先完全丟掉之前的數軸,我要重新建立一個數軸,然後我從第一個元素開始往新的數軸裡面放,之前的數軸我用 i 來遍歷,新的數軸我用 j 來表示,temp用來陳放我從舊數軸裡面拿出來的數,然後用一個while迴圈來確定這個數應該放到哪兒,j>0跳過while表示拿到第一個數我直接往裡面扔,然後再從後往前的比較temp該放的位置。注意雖然在while迴圈中會短暫的出現一個數軸裡面有兩個相同數的情況但是這是暫時的,多出來的那個重複的數其實是temp再上面。while跳出後那個重複的數立馬被temp替換。
程式碼:
這是流程圖
void Insertion(int N) //direct sequencing
{
int i,j,temp;
for(i=0;i<N;i++){
temp=G[i];
j=i;
while((j>0)&&(G[j-1]>temp)){
G[j]=G[j-1];
j=j-1;
}
G[j]=temp;
}
printf("直接排序輸出:");
for(int i=0;i<N;i++){
printf("%d ",G[i]);
}
}
2.氣泡排序是我大一的時候讓我很苦惱,我似乎一直都沒有完全掌握。我覺的之所以冒泡經典就是因為它程式碼的簡介,直接兩個for迴圈就可以完成。外層迴圈是從N-1遞減到0,外層迴圈決定了內層迴圈的上界,所以這兩個迴圈的判斷符號非常重要。
程式碼:
這是流程圖
void Bubble(int N){
int i,j,temp;
for(i=N-1;i>=0;i--){
for(j=1;j<=i;j++){
if(G[j-1]>G[j]){
temp=G[j-1];
G[j-1]=G[j];
G[j]=temp;
}
}
}
printf("氣泡排序輸出:");
for(int i=0;i<N;i++){
printf("%d ",G[i]);
}
}
3.選擇演算法也非常簡單,直接每次都從數軸裡找最小的填進去就完事了,但還是要注意一下判斷符號,外層迴圈有N-1是因為只需執行N-1步就可以了最後的第N步沒有必要執行。
程式碼:
這是流程圖
void Selection(int N){
int i,j,min;
int temp;
for(i=0;i<N-1;i++){
min=i;
for(j=i+i;j<N;j++){
if(G[j]<G[min]) min=j;
}
temp=G[i];
G[i]=G[min];
G[min]=temp;
}
printf("選擇排序輸出:");
for(int i=0;i<N;i++){
printf("%d ",G[i]);
}
}