排序演算法非常重要,在計算機中,計算機中排序資料占用的工作量有20%左右,所以研究排序演算法有助於我們提高工作效率。
排序演算法的效能由以下幾點決定
1.比較次數
2.交換次數
3.讀寫陣列次數
ps:對於不交換元素的演算法,我們會計算訪問陣列次數。
一.選擇排序
1.原理
找到陣列最小的那個數,和第乙個元素交換位置(如果第乙個數是最小,就和自己交換),然後,在剩下元素當中,找到最小的數,和第二個數交換。如此類推下去。
public
class selection}}
}
選擇排序演算法有兩個鮮明的特點
1.執行時間和輸入無關。
因為是為了找出最小的元素,掃瞄一遍陣列並不能為下一次掃瞄提供什麼資訊。排列乙個已有序或者是隨機的陣列時間都一樣長!。
2.資料移動是最少的。
每次交換,改變兩個陣列元素的值,n次交換-交換次數和陣列大小是線性關係。
3.原地操作是唯一的優點。
最差時間複雜度 о(n²)
最優時間複雜度 о(n²)
平均時間複雜度 о(n²)
二.插入排序
1.原理
舉個例子
2 3 4 1 5。
遍歷到1,比2小。插入到2前面。
1 2 3 4 5。
這種就是插入排序。
將每個元素插入到其他已經有序的適當位置中。
public
class insertion
}}
插入排序的特點
1.插入排序的時間取決於輸入元素的初始順序
2.對於一些部分有序的陣列,和小規模陣列,插入排序很高效。
ps:陣列中只有幾個元素位置不正確
乙個大的有序陣列接著乙個小陣列
陣列中每個元素距離它最終位置不遠
這三種情況插入排序很有效率
最差時間複雜度 o(n^2)
最優時間複雜度 o(n)
平均時間複雜度 o(n^2)
提高插入排序的效能
方法:在內迴圈中較大的元素都向右移動而不總是交換兩個元素(這樣訪問陣列的次數大幅度減少)
以下是提高插入排序的效能的演算法
public
class
insertionx()
}if(exchanges==0) return
false;
for(int i=2;iint j=i;
while(less(v,a[j-1]))
a[j]=v;}}
}
插入排序和選擇排序
對於隨機排序的無重複的陣列,插入和選擇的執行時間都是平方級別
排序演算法 插入排序和選擇排序
二者演算法分析 穩定性 時間複雜度 希爾排序 希爾排序是直接插入排序的優化,但當待排序數列很大時,預排序過程效率會降低許多,時間複雜度為o n2n2 空間複雜度 空間複雜度都為o 1 在進行排序時,會建立臨時常數個臨時變數用於控制下標 直接插入排序 void insertsort datatype ...
選擇排序和插入排序
選擇排序 時間複雜度 o n 2 額外空間複雜度o 1 選擇排序是從陣列的第乙個值即arr 0 開始,先假定當前值為最小值,記下index值,向後遍歷陣列,當 arr i 小於arr index 時,令index i 一直到arr length 1 獲得最小值的index然後與arr 0 交換,此時...
插入排序和選擇排序
排序 將一組雜亂無章的資料按照一定的規則有組織地排列起來。排序的穩定性 如果在排序中,存在前後相同的兩個元素的話,排序前和排序後他們的相對位置不發生變化。今天,先來學習插入排序和選擇排序 插入排序 直接插入排序 1 思想 每一步將乙個待排序的元其排序碼的大小,插入到前面已將排好序的一組元素的合適位置...