# 選擇排序
## 定義:
> 選擇排序算法的實現思路有點類似插入排序,也分已排序區間和未排序區間。但是選擇排序每次會從未排序區間中找到最小的元素,將其放到已排序區間的末尾。

## 代碼:
```
/**
* @param $nums
* @return mixed
* 4 3 2 1
*/
function selection_sort($nums){
if(count($nums) <= 1){
return $nums;
}
for($i=0;$i<count($nums);$i++){//控制最大循環次數,未排序區的第一個值
$min = $i;//假設最小的數的為未排序區的第一個數
for($j=$i+1;$j<count($nums);$j++){//拿未排序區的每一個值與最小數比較,總是記錄最小的數,這樣就可以找到未排序區的最小值
if($nums[$j] < $nums[$min]){
$min = $j;
}
}
if($min != $i){//把未排序區的最小值與未排序區第一個數交換位置,也就是把未排序區中的最小值放到已排序區的后面
$temps = $nums[$i];
$nums[$i] = $nums[$min];
$nums[$min] = $temps;
}
}
return $nums;
}
$nums = [4,3,1,2];
print_r(selection_sort($nums));
```
## 選擇排序的性能和穩定性
1. 時間復雜度: O(n^2) (n的平方)
2. 空間復雜度:原地排序算法
3. 算法穩定性:涉及非相鄰元素的位置交換,所以是不穩定的排序算法
## 總結:
> 綜合比較前面介紹的三個排序算法,時間復雜度都是一樣的,也都是原地排序,但是選擇排序是不穩定的排序算法,此外,插入排序和冒泡排序相比較,我們在將插入排序的時候講到,插入排序只需要一條語句,而冒泡排序需要三條,在同等條件下,或者數據量很大的情況下,插入排序性能是要由于冒泡排序的,所以綜合比較下來,三者的優先級是插入排序 > 冒泡排序 >> 選擇排序。但是三者的時間復雜度都是 O(n^2),數據量很大的情況下性能表現并不是很理想
- PHP操作集合
- 獲取字符首字母
- PHP實現定時備份MySQL數據庫
- PHP定時發送郵件
- PHP基本語法
- 總結
- 命名空間
- 錯誤抑制符
- 位運算符
- 原碼,反碼,補碼
- traits
- PHP的反射機制
- const和define的區別
- 語法
- 常用的函數
- 1.變量及打印函數
- 2.引入文件
- 3.常量
- 4.錯誤處理
- 5.面向對象
- 數據結構與算法
- 結構
- 數組
- 索引
- 散列表(哈希表)
- 棧
- 隊列
- 鏈表
- 算法
- 排序算法
- 插入排序
- 冒泡排序
- 選擇排序
- 歸并排序
- 快速排序
- 查找算法
- 二分查找
- 二分查找變形版本1:查詢數據在序列中第一次出現
- 哈希算法
- 算法復雜度
- Smarty模板引擎
- composer
- yaf
- yaf的安裝配置
- 其它
- Java
- JavaSE
- 1.Java發展及JDK安裝配置
- 2.Eclipse的下載及安裝
- 3.Java開發基礎
- 虛擬機
- 2.編輯虛擬機設置
- 1.虛擬機下安裝centos
- 3.安裝vmtools
- Linux
- 1.vi和vim編輯器
- 2.開機、重啟和用戶登錄注銷
- 3.用戶管理
- 4.用戶組管理
- 5.用戶和組的相關文件
- 6.linux運行級別
- 7.幫助指令
- 8.文件目錄類指令
- 9.時間日期類
- 10.搜索查找類
- 11.壓縮和解壓縮
- 12.組管理和權限管理(難點,重點)
- 虛擬主機的配置
- phpstudy快捷配置
- 配置文件配置
- PHP面向對象高級特性
- SPL標準庫(PHP標準庫)
- PHP鏈式操作的實現
- 面向對象編程的基本原則
- 設計模式
- 基本的設計模式