//歸併排序
public
class
mergesort
int mid =
(right - left)/2
+ left;
mergesort
(data, left, mid)
;mergesort
(data, mid +
1, right)
;int i = left;
int j = mid +1;
int temp =0;
while
(i < j && j <= right)
else}if
(i == j)
temp = j;
while
(j <= right)
else
}// 比如data = [1,4,5,10,2,4,7,8],此時i=1,temp=4,j=5
// 先變成[1,10,5,4,2,4,7,8]
reverse
(data, i, temp -1)
;// 再變成[1,10,5,4,2,4,7,8]
reverse
(data, temp, j -1)
;// 最後[1,2,4,5,10,4,7,8]
reverse
(data, i, j -1)
;// j-temp是上一步參加翻轉的第二組資料個數,i跳過它們,繼續往下。
i += j - temp;}}
private
void
swap
(int
data,
int left,
int right)
// 翻轉陣列
private
void
reverse
(int
data,
int left,
int right)
while
(left < right)
}// 借助輔助陣列實現
public
void
mergesort2
(int
data,
int left,
int right)
// 先定義乙個輔助陣列,防止在遞迴中新建大量陣列
int[
] temp =
newint
[data.length]
;mergesort2
(data, left, right, temp);}
private
void
mergesort2
(int
data,
int left,
int right,
int[
] temp)
int mid =
(right - left)/2
+ left;
mergesort2
(data, left, mid, temp)
;mergesort2
(data, mid +
1, right, temp)
;int count = left;
int i = left;
int j = mid +1;
while
(i < mid +
1&& j <= right)
else
}while
(j <= right)
else}}
// count小於等於right,說明有沒填完的
if(count <= right)
}else}}
// 把temp中排好的寫入data中。
for(
int k = left; k <= right; k++)}
}
八大排序演算法(七)歸併排序
基本思想 歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。歸併排序示例 合併方法 設r i n 由兩個有序子表r i m 和r m 1 n 組成,兩個子表長度分別為n i 1 n m。...
八大排序演算法 歸併排序
歸併排序的定義 是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。歸併排序的基本思想 設r i n 由兩個有序子表r i m 和r m 1 n 組成,兩個子表長度分別為n i 1 n m。1 j m 1 k i...
八大排序 歸併排序
歸併排序 1.申請空間,使其大小為兩個已經排序的序列之和,用來存放合併後的序列。2.設定兩個指標指向兩序列的開始。3.比較兩個指標所指的元素,選擇小的放的合併空間,移動指標。4.重複3直到某個指標到達序列尾。5.將剩餘的元素拷到合併空間。實現 void merge sort int arr,int ...