iOS算法篇(二)選擇排序算法

經典排序算法 - 選擇排序Selection sort

顧名思意,就是直接從待排序數(shù)組里選擇一個最小(或最大)的數(shù)字,每次都拿一個最小數(shù)字出來,

順序放入新數(shù)組,直到全部拿完

再簡單點,對著一群數(shù)組說,你們誰最小出列,站到最后邊

然后繼續(xù)對剩余的無序數(shù)組說,你們誰最小出列,站到最后邊

再繼續(xù)剛才的操作,一直到最后一個,繼續(xù)站到最后邊,現(xiàn)在數(shù)組有序了,從小到大

效率稍高一些的排序【選擇排序】

選擇排序(Selection sort)是一種簡單直觀的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再從剩余未排序元素中 繼續(xù)尋找最小(大)元素,然后放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。

選擇排序的主要優(yōu)點與數(shù)據(jù)移動有關。如果某個元素位于正確的最終位置上,則它不會被移動。選擇排序每次交換一對元素,它們當中至少有一個將被移到其 最終位置上,因此對n個元素的表進行排序總共進行至多n-1次交換。在所有的完全依靠交換去移動元素的排序方法中,選擇排序屬于非常好的一種。

簡要的說就是先取出或假設一個最小或最大的數(shù),之后在剩下的數(shù)里挑選一個最小或最大的,再和我們認為的最小或最大的數(shù)比較。滿足條件就交換位置

舉例

先說看每步的狀態(tài)變化,后邊介紹細節(jié),現(xiàn)有無序數(shù)組[6 2 4 1 5 9]

第一趟找到最小數(shù)1,放到最前邊(與首位數(shù)字交換)

交換前:| 6 | 2 | 4 | 1 | 5 | 9 |

交換后:| 1 | 2 | 4 | 6 | 5 | 9 |

第二趟找到余下數(shù)字[2 4 6 5 9]里的最小數(shù)2,與當前數(shù)組的首位數(shù)字進行交換,實際沒有交換,本來就在首位

交換前:| 1 | 2 | 4 | 6 | 5 | 9 |

交換后:| 1 | 2 | 4 | 6 | 5 | 9 |

第三趟繼續(xù)找到剩余[4 6 5 9]數(shù)字里的最小數(shù)4,實際沒有交換,4待首位置無須交換

第四趟從剩余的[6 5 9]里找到最小數(shù)5,與首位數(shù)字6交換位置

交換前:| 1 | 2 | 4 | 6 | 5 | 9 |

交換后:| 1 | 2 | 4 | 5 | 6 | 9 |

第五趟從剩余的[6 9]里找到最小數(shù)6,發(fā)現(xiàn)它待在正確的位置,沒有交換

排序完畢輸出正確結果[1 2 4 5 6 9]

第一趟找到最小數(shù)1的細節(jié)

當前數(shù)組是| 6 | 2 | 4 | 1 | 5 | 9 |

先把6取出來,讓它扮演最小數(shù)

當前最小數(shù)6與其它數(shù)一一進行比較,發(fā)現(xiàn)更小數(shù)就交換角色

當前最小數(shù)6與2比較,發(fā)現(xiàn)更小數(shù),交換角色,此時最小數(shù)是2,接下來2與剩余數(shù)字比較

當前最小數(shù)2與4比較,不動

當前最小數(shù)2與1比較,發(fā)現(xiàn)更小數(shù),交換角色,此時最小數(shù)是1,接下來1與剩余數(shù)字比較

當前最小數(shù)1與5比較,不動

當前最小數(shù)1與9比較,不動,到達末尾

當前最小數(shù)1與當前首位數(shù)字進行位置交換,如下所示

交換前:| 6 | 2 | 4 | 1 | 5 | 9 |

交換后:| 1 | 2 | 4 | 6 | 5 | 9 |

完成一趟排序,其余步驟類似

代碼僅供參考

復制代碼

static void selection_sort(int[] unsorted)

{

for (int i = 0;? i < unsorted.Length-1; i++)//1、外層循環(huán)的結束條件不妥,因為循環(huán)排序到最后一個就是最大/小值了,不需要在進行比較,所以應該去除

{

int min = unsorted[i], min_index = i;

for (int int j = i+1; j < unsorted.Length; j++)//2、內層循環(huán)的初始條件不妥,如果從i開始就是和自身進行比較了,多余

{

if (unsorted[j] < min)

{

min = unsorted[j];

min_index = j;

}

}

if (min_index != i)

{

int temp = unsorted[i];

unsorted[i] = unsorted[min_index];

unsorted[min_index] = temp;

}

}

}

static void Main(string[] args)

{

int[] x = { 6, 2, 4, 1, 5, 9 };

selection_sort(x);

foreach (var item in x)

{

Console.WriteLine(item);

}

Console.ReadLine();

}

排序法 ?最差時間分析 平均時間復雜度 穩(wěn)定度 空間復雜度

選擇排序 O(n2) O(n2) 穩(wěn)定 O(1)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 概述 排序有內部排序和外部排序,內部排序是數(shù)據(jù)記錄在內存中進行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,220評論 0 52
  • 概述:排序有內部排序和外部排序,內部排序是數(shù)據(jù)記錄在內存中進行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,743評論 0 15
  • 某次二面時,面試官問起Js排序問題,吾絞盡腦汁回答了幾種,深感算法有很大的問題,所以總計一下! 排序算法說明 (1...
    流浪的先知閱讀 1,208評論 0 4
  • 轉載自:https://egoistk.github.io/2016/09/10/Java%E6%8E%92%E5...
    chad_it閱讀 1,005評論 0 18
  • 作者簡介: 曲木子,人群中的無名者、路人甲。沒有上過大學,去過很多地方,做過很多工作,沒有豐功偉績,卻也歷經滄桑,...
    曲木子閱讀 344評論 0 4