数据结构 - 简单选择排序法
數(shù)據(jù)結(jié)構(gòu) - 簡(jiǎn)單選擇排序法
在之前的博文里已經(jīng)介紹過(guò)排序的兩個(gè)基本方法:
雙重循環(huán)法和冒泡排序法。
基本思想
其實(shí)上面兩種方法的基本思想都是一樣的:
就是將排序步驟分成兩層循環(huán), 在內(nèi)層的每1個(gè)循環(huán)中, 找出剩下未排序成員最小(大)的1個(gè), 并將其放到隊(duì)伍前列。
只不過(guò), 冒泡排序法的元素交換更具效率, 通常情況下會(huì)比雙重循環(huán)法更快完成排序。
這次介紹的簡(jiǎn)單選擇法的本質(zhì)也和上面兩種方法一樣的。
冒泡(or 雙層循環(huán))排序法每1個(gè)內(nèi)層循環(huán)中, 會(huì)通過(guò)多次元素交換, 最終最小(大)的未排序元素會(huì)被移動(dòng)到隊(duì)伍前列。
而簡(jiǎn)單選擇法就是定1個(gè)最小變量, 在1個(gè)內(nèi)層循環(huán)中, 通過(guò)比較(而不是元素交換)得到未排序的最小(最大)元素的位置。然后才1次過(guò)把這個(gè)元素移動(dòng)到前列。
簡(jiǎn)單選擇排序法 代碼
如果你看懂上面寫的是什么, 代碼是很容易寫出來(lái)的。
int simpleSelectionSort(int * arr, int len){int i,j;int min;for (i = 0; i < len -1; i++){min = i; //first make the first element to be the minfor (j = i+1; j < len; j++){if (arr[j] < arr[min]){min = j;}}//then the arr[j] is the min element in the loopif (i != min){_swap(arr, i, min);}}}代碼分析
上面代碼很簡(jiǎn)單, 在每1個(gè)內(nèi)循環(huán)中, 我們會(huì)用min這個(gè)變量來(lái)存儲(chǔ)最小的元素位置。
然后用未排序元素來(lái)跟min位置元素比較…
debug信息:
4, 1, 5, 8, 0, 3, 7, 9, 6, 2 step 0: changed: *0, 1, 5, 8, *4, 3, 7, 9, 6, 2 0, *1, 5, 8, 4, 3, 7, 9, 6, 2 step 1: changed: 0, 1, *2, 8, 4, 3, 7, 9, 6, *5 step 2: changed: 0, 1, 2, *3, 4, *8, 7, 9, 6, 5 0, 1, 2, 3, *4, 8, 7, 9, 6, 5 step 3: changed: 0, 1, 2, 3, 4, *5, 7, 9, 6, *8 step 4: changed: 0, 1, 2, 3, 4, 5, *6, 9, *7, 8 step 5: changed: 0, 1, 2, 3, 4, 5, 6, *7, *9, 8 step 6: changed: 0, 1, 2, 3, 4, 5, 6, 7, *8, *9 change count: 7 compare count: 45 0, 1, 2, 3, 4, 5, 6, 7, 8, 9可以見(jiàn)到這個(gè)簡(jiǎn)單選擇排序方法不能減少比較次數(shù), 但是大大減少了元素交換的次數(shù)。
簡(jiǎn)單選擇排序法的時(shí)間復(fù)雜度仍然是O(n2)
小結(jié)
其實(shí)本文一開始提到的博文中提到, 冒泡排序法通過(guò)優(yōu)化是能夠元素比較次數(shù)的。
如果你的排序元素交換的開銷比比較開銷大得多的話,這個(gè)簡(jiǎn)單排序法是可以考慮的.
總結(jié)
以上是生活随笔為你收集整理的数据结构 - 简单选择排序法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Spring AOP 简介以及简单用法
- 下一篇: 数据结构 - 直接插入排序法