轻松读懂数据结构系列:早操排队图解选择排序
一、說在前面
一直想寫一些簡單易懂的文章,因為平時看的很多的書籍或者文章都是看著很難受的感覺,當然,這并不是說書籍寫的不好,只是說對于一些沒有太多基礎或者基礎不是很好的來說,相對來說還是比較難以理解的。
這個系列主要是寫一些簡單易懂的數據結構與算法的文章,同時也是幫助自己再理解理解這方面的知識。
作為數據結構與算法的開篇,還是以排序算法作為第一部分的內容,需要注意的是,這一系列的文章并不是涉及到很多理論性質的知識,因為前面說了,主要還是希望文章是簡單易懂的,希望能達到讀故事的感覺。如果需要去學習理論性質的知識,可以去查看相關的數據結構與算法的書籍。
二、選擇排序算法
今天早上,老師又叫我們去操場上做早操,做早操之前呢,今天也需要排隊,到操場的同學有5個人,今天的排序方法還是按照身高由低到高排列。
但是,今天老師說換一種方法排隊,我來給你們排隊,昨天你們排隊太慢了。
于是,老師說:第一個同學站在原地不要動。
然后,我從后面4個同學當中挑一個最矮的同學,這個同學站在第一個同學后面,你們兩個站在原地不要動。
之后,老師再從后面3個同學里面挑一個最矮的同學,然后讓他站在前面兩個排好的同學后面,這樣這三個同學就排好了,你們站著不要動。
老師又從最后兩個同學中挑一個最矮的同學,讓他站在前面三個已經排好的隊伍后面,這樣,這四個同學就排好隊列,這四個同學站著不要動。
四個同學排好了,只有最后一個同學了,然后,這個同學自己站到前面四個已經排好隊的隊伍的最后,這樣5個同學的位置就排好了。
老師看到排好了隊,非常開心,對同學們說:“我排隊是不是比你們自己排隊快啊!”
然后,這位程序員老師說,哪位同學懂了剛剛我給你們排隊的思想,能不能敘述一下,這時候,小明說:我會!,于是,小明說了一下思想:
初始時在隊伍中找到最小(大)元素,放到隊伍的起始位置作為已排好隊伍;然后,再從剩余未排序隊伍中繼續尋找最小(大)元素,放到已排序隊伍的末尾。以此類推,直到所有元素均排序完畢。
老師說,隊列都給你們排好了,小明同學也又很好的闡述了思想,你們把代碼實現以下吧(哈哈哈!)。
于是,小海同學就去按照老師的排隊方法,實現了選擇排序算法
public static void selectionSort(int[] arr) {if (arr == null || arr.length < 2) {return;}for (int i = 0; i < arr.length - 1; i++) {int minIndex = i;for (int j = i + 1; j < arr.length; j++) {//在待排序區選擇最小的元素minIndex = arr[j] < arr[minIndex] ? j : minIndex;}swap(arr, i, minIndex);// 放到已排序序列的末尾,該操作很有可能把穩定性打亂,所以選擇排序是不穩定的排序算法}}public static void swap(int[] arr, int i, int j) {int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}性能分析
最差時間復雜度:O(n^2)
最優時間復雜度:O(n^2)
平均時間復雜度: O(n^2)
所需輔助空間:O(1)
穩定性:不穩定
文章有不當之處,歡迎指正,如果喜歡微信閱讀,你也可以關注我的微信公眾號:好好學java,獲取優質學習資源。
總結
以上是生活随笔為你收集整理的轻松读懂数据结构系列:早操排队图解选择排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: com.mysql.jdbc.Packe
- 下一篇: Activiti工作流从入门到入土:入门