選擇排序(selection sort)是一種簡單直觀的排序演算法。它的工作原理是每一次從待排序的資料元素中選出最小(或最大)的乙個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。排序趟數為n-1次,n為元素大小。
對比陣列中前乙個元素跟後乙個元素的大小,如果後面的元素比前面的元素小則用乙個變數k來記住他的位置,接著第二次比較,前面「後乙個元素」現變成了「前乙個元素」,繼續跟他的「後乙個元素」進行比較如果後面的元素比他要小則用變數min記住它在陣列中的位置(下標),等到迴圈結束的時候,我們應該找到了最小的那個數的下標了,然後進行判斷,如果這個元素的下標不是第乙個元素的下標,就讓第乙個元素跟他交換一下值,這樣就找到整個陣列中最小的數了。然後找到陣列中第二小的數,讓他跟陣列中第二個元素交換一下值,以此類推。
之所以要在交換前進行判斷變數min是否發生了變動,是因為若沒有發生變動就不需要自己跟自己交換,這樣做沒有意義,會影響效率。之所以要用變數min來指代陣列起始點的下標而不用for迴圈中的i變數直接做下標,是因為i變數還要控制選擇排序的趟數。若i被意外修改了,整個排序也就亂套了。
選擇排序是先記住下標,等待一趟排序結束後,才使用最小值的下標進行交換的,這樣能增強演算法的效率。
附圖:
選擇排序的交換操作介於 0 和 ( n - 1 ) 次之間。選擇排序的比較操作為 n ( n - 1) / 2 次之間。選擇排序的賦值操作介於 0 和 3 ( n - 1) 次之間。
比較次數o(n²),比較次數與關鍵字的初始狀態無關,總的比較次數n=( n-1)+( n-2)+…+1=n*( n-1)/ 2。交換次數o( n),最好情況是,已經有序,交換0次;最壞情況交換n-1次,逆序交換n/2次。交換次數比氣泡排序少多了,由於交換所需cpu時間比比較所需的cpu時間多,n值較小時,選擇排序比氣泡排序快。
選擇排序是給每個位置選擇當前元素最小的,比如給第乙個位置選擇最小的,在剩餘元素裡面給第二個元素選擇第二小的,依次類推,直到第n - 1個元素,第n個元素不用選擇了,因為只剩下它乙個最大的元素了。那麼,在一趟選擇,如果乙個元素比當前元素小,而該小的元素又出現在乙個和當前元素相等的元素後面,那麼交換後穩定性就被破壞了。比較拗口,舉個例子,序列5,8,5,2,9,我們知道第一遍選擇第1個元素5會和2交換,那麼原序列中兩個5的相對前後順序就被破壞了。
因此,選擇排序是一種不穩定的排序演算法。
/**
*@author hanlin wang
*///每輪排序,最小值在起始位置處,也就是,往左邊堆積最小值。
public
class
selectsort ;
//進行排序
selectsort.sort(data);
//拼接結果
}//定義選擇排序
public
static
void
sort(int data)
}//若min角標與本輪比較的i的初始值不同,排序過程中min角標發生了變化,交換值。
if (min != i)
//本輪排序結果
string txt = "";
for (int a : data)
system.out.println("第" + (i+1) + "輪排序的結果為:");
system.out.println(txt.substring(0, txt.length() - 1) + "\n");}}
//靜態的交換方法
public
static
void
swap(int data, int min, int i)
}
執行結果:
第1輪排序的結果為:
1,54,26,75,45,87,46,23,2,14,18,3
第2輪排序的結果為:
1,2,26,75,45,87,46,23,54,14,18,3
第3輪排序的結果為:
1,2,3,75,45,87,46,23,54,14,18,26
第4輪排序的結果為:
1,2,3,14,45,87,46,23,54,75,18,26
第5輪排序的結果為:
1,2,3,14,18,87,46,23,54,75,45,26
第6輪排序的結果為:
1,2,3,14,18,23,46,87,54,75,45,26
第7輪排序的結果為:
1,2,3,14,18,23,26,87,54,75,45,46
第8輪排序的結果為:
1,2,3,14,18,23,26,45,54,75,87,46
第9輪排序的結果為:
1,2,3,14,18,23,26,45,46,75,87,54
第10輪排序的結果為:
1,2,3,14,18,23,26,45,46,54,87,75
第11輪排序的結果為:
1,2,3,14,18,23,26,45,46,54,75,87
基礎演算法之選擇排序Selection Sort
原理 首先在未排序序列中找到最小 大 元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小 大 元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。一種簡單直觀的排序演算法。例子將陣列 3,6,4,2,5,1 進行從大到小排序 排序步驟 第一趟找到最小數1,放到最前邊...
排序 選擇排序 選擇排序 堆排序
寫在前面 上傳github交換排序選擇排序 堆排序 選擇排序 顧名思義,我們就可以猜到,它是原則合適的元素放到合適的位置 從圖中,我們可以得到 1.用第乙個元素,和其他所有的元素進行比較,找出最小的,然後進行交換 2.然後進行,資料的遞增 3.直到資料全部有序 void selectsort int...
選擇排序 直接選擇排序
演算法思想 在每一趟的排序中,從待排序列中選出關鍵字最小或者最大的元素放在其最終的位置上 過程分析 在第i趟直接排序中,通過n i次關鍵字的比較,從n i 1個元素中選出關鍵字最小的元素 與第i個元素進行交換。經過n 1趟比較,直到表有序為止 效能分析 時間複雜度o n 2 include defi...