for (int i = 0; i < n; i++)
swap(arr[minindex],arr[i]);
}
選擇排序作為最穩定的排序演算法之一,因為無論什麼資料進去都是o(n^2)的時間複雜度(無論近似有序還是完全無序)。
for (int i = 1; i < n; i++)
//for (int j = i ; j > 0 && arr[j-1] > arr[j] ; j--)
// swap(arr[j-1], arr[j]);
}
插入排序相對於選擇排序最重要的就是可以提前結束內層迴圈(除了完全無序需要全部走一遍)。
為什麼插入排序和選擇排序的複雜度都是o(n^2),且插入排序可以提前結束,而效能卻不如選擇排序呢?
因為兩種排序中最影響效能的語句是交換語句,在這裡是swap()函式。選擇排序的swap()的執行次數為o(n),而插入排序的swap()的執行次數平均是o(n),但是對於隨機生成的陣列,執行次數遠大於o(n)。所以插入排序的效能低於選擇排序。
由於插入排序的最好情況時間複雜度為o(n),造成交換語句的失效。因此,對於近似有序的陣列,插入排序的效能高於選擇排序。
for (int i = 1; i < n; i++)
改進版的插入排序,利用簡單的賦值語句代替了交換語句。不僅能提前結束,而且沒有交換語句。效能提高很多。 直接插入排序和選擇排序
一 直接插入排序 思路 1 用乙個臨時變數存放待排序的數字 2 從陣列前依次遍歷找第乙個比待排序數字大的數字的位置 3 將從待排序的數字位置開始,到找的要插入的數字的位置之間的數字向後挪一位,最後將待排序數字插入到找到的位置 如下 void insert sort int arr,int len f...
插入排序 直接插入排序
直接插入排序演算法思想 將整個資料表分成左右兩個子表,其中左子表為有序表,右子表為無序表 整個排序過程就是將右子表中的元素逐個插入到左子表中,直到右子表為空,而左子表成為新的有序表。演算法過程分析 將待排序的元素存放在陣列r n 1 中,在初始狀態下,r 0 為監視哨,r 1 為有序區,r 2 r ...
插入排序 直接插入排序
一.插入排序的基本思想 將乙個記錄插入已排序好的有序表中,從而得到乙個新的記錄數加1的有序表。要點 設立哨兵,作為臨時儲存和判斷陣列邊界之用。所謂的哨兵,就是即將插入的記錄。二.示例 如果碰見相等的元素,會被插到後面,所以,相等元素的前後順序沒有改變,插入排序是穩定的。三.演算法實現 public ...