排序始終是個繞不過去的問題 0.0
歸併排序
思路
- 步驟
- 劃分問題: 把序列分成元素個數儘量相等的兩半
- 遞歸求解:把兩半元素分別排序
- 合併問題:把連個有序表合併成一個
- 算法的時間複雜度: O(nlogn) (這個我還沒理解)
注意
- 在上圖中,比如說當序列變成
A[i]:38,49,65,97B[j]:13,27,76 並將A和B合併到T中在合併的過程中,都是從A中拿出當前第i個元素和B中第j個元素比較的, 但是到了最後,肯定是某個數組全部的合併到了T中,但是另一個數組中的元素有剩餘,這時間,將剩餘的元素全部合併到T中(在此例中指的A,因爲當B全部進到T中時,A還有97這個元素)
代碼
public static void mergeSort(int x,int y){
if (y-x > 1){
int m = x + (y-x)/2;
int p = x;
int q = m;
int i = x;
mergeSort(x, m);
mergeSort(m, y);
while (p<m || q<y){
if (q >=y || (p<m && data[p] <= data[q])){
// 這裏是左半部分進入數組temp的條件,即要麼比右邊的元素小,要麼右邊的元素已經全部進入temp數組
temp[i++] = data[p++];
}else{
temp[i++] = data[q++];
}
}
for ( i=x; i<y; i++){
data[i] = temp[i];
}
}
}
插入排序
思想
- 其實插入排序就像是打撲克牌:
- 手裏已經有的牌是有序的
- 當來一種新牌的時候,則從最後一個牌開始比較,慢慢的向前迭代
- 如果已有的牌比新牌大,則把已有牌往後移動一個位置
- 如果已有牌不大,則已有牌的後面插入新牌
代碼
public int[] insertSort(int[] nums) {
int j,temp;
for (int i = 1; i < nums.length; i++) {
temp = nums[i];
for ( j = i; j > 0 && temp > nums[j-1]; j--) {
nums[j] = nums[j-1];
}
nums[j] = temp;
}
return nums;
}
快排
代碼
這個算法真是個激動人心的算法