今天繼續介紹一種排序算法:選擇排序。
選擇排序的基本思想就是從待排序列中選擇出最小的,然后將被選出元素和序列的第一個元素互換位置(當前默認是升序排列),則互換完成后第一個元素就是整個序列的最小的元素,則一次選擇排序結束。然后我們從剩下的子序列中選擇出最小的,然后將該被選出來的元素和該子序列的第一個元素(即整個序列的第二個元素)互換位置,則當前整個序列的第二個元素就是當前序列中的次最小值,第二次選擇排序結束。以此類推,直到該待排序列只剩下一個元素后,則整個序列有序。
具體過程如下圖所示:
下面就不多說了,直接上代碼,里面幾乎每句話都有注釋:
1 #include <stdio.h> 2 3 /* 4 簡單選擇排序(假定為升序排列): 5 簡單選擇排序原理是從當前序列中取出一個最小值,將當前選出的最小值和第一個值互換。然后從剩余序列中再選出最小值,和該序列 6 的第二只互換,直到當前序列只剩下一個值,當前整個序列即為有序序列。 7 */ 8 9 void easySelectSort(int *arr[],int len); 10 int selectMinPos(int arr[],int len,int i); 11 12 13 int main(int argc, char *argv[]) 14 { 15 16 int arr[5]={ 17 3,19,32,1,8 18 }; 19 easySelectSort(arr,5); 20 int i; 21 for(i=0;i<5;i++){ 22 printf("%d ",arr[i]); 23 } 24 25 return 0; 26 } 27 28 /* 29 排序算法 30 */ 31 void easySelectSort(int *arr[],int len){ 32 //因為是從左向右逐漸減一做選擇最小值的操作,則必定需要去遍歷整個序列 33 int j; //定義一個整形變量j,用來存儲被選擇出來的最小值的下標 34 int temp; //定義一個臨時變量temp用來在互換時存儲臨時變量 35 int i; 36 for(i=0;i<len;i++){ 37 j=selectMinPos(arr,len,i); //當前方法表示對arr數組從i開始到arr.length-1的序列進行選擇最小值的操作,並將下標賦給j 38 39 if(i!=j){ //只有在i和j不等,即被選擇出來的最小值的位置不是當前開始的位置時我們才進行元素位置的互換 40 temp=arr[j]; 41 arr[j]=arr[i]; 42 arr[i]=temp; 43 } 44 } 45 } 46 47 /* 48 選擇最小元素位置的方法 49 arr:被選擇的數組 50 i:從什么下標開始到arr.length-1的被選擇序列 51 */ 52 int selectMinPos(int arr[],int len,int i){ 53 int pos=i; //定義一個pos位置變量,並默認賦值為i 54 for(i;i<len;i++){ 55 /** 56 我們從pos(即i)開始作比較,只有當所對應的數組值大於i對應的變量值時,將pos=i;這就相當於我們先假定pos(即i)下標 57 對應的數組值是最小的,然后逐一拿着后邊的(i++)值和當前pos下標對應的值作比較,發現更下的就將i賦給pos,這樣遍歷一遍 58 之后就能找到最終的最小的值對應的下標 59 */ 60 if(arr[pos]>arr[i]){ 61 pos=i; 62 } 63 } 64 return pos; 65 }
以上就是選擇排序算法的原理、圖示以及代碼實現,這也只是我自己的理解,如果有不對的地方還請大家指出來。
以上博文系博主原創,轉載請標明出處,謝謝。