最近在學習《演算法導論》一書,隨手做一下筆記。
輸入:
for
(int i =
1; i < numbers.length; i++
) system.out.
println()
;}}}
return numbers;
輸出:
為了乙個給定的問題,演算法一次或多次遞迴地呼叫其自身以解決緊密相關的若干子問題。
歸併排序,完全遵循分治模式。直觀上其操作如下:
將待排序的n 個元素分解成各具 n/2的元素的兩個子串行。
使用歸併排序遞迴地排序兩個子串行。
合併兩個已經排序的子串行。
假設現在有乙個序列,那如果按歸併排序的思想來操作的話,操作步驟如下:
現假設有已經排序好的兩組陣列 a[left…mid],b[mid…right]。現只要將 a 與 b 中軟小的數字取出,依次存入
c 中,那麼排序就完成了。則這個實現過程如下:
/**
* * @param a 待排序陣列
* @param left 起始下標
* @param mid 中間下標
* @param right 右邊界下標
*/public
static
void
merge
(int
a,int left,
int mid,
int right)
else
}//有可能左右兩邊的陣列沒拿完,上面的迴圈就已經結束了。這裡就把沒拿完的陣列放到臨時陣列裡。
//舉個例子,原陣列為 【1,5,4,3】,則可分為 [1,5],[4,3],mid = 1;left = 0,right = 3;
//第一迴圈,取出1,則 temp = [1,0,0,0],此時,i = 0; j = 2; , i++;
//第二迴圈,取出3,則 temp = [1,3,0,0],些時,i = 1,j = 2; j ++
//第三個迴圈,取出 4,則此時 temp = [1,3,4,0],此時 i = 1,j = 3,j++;
//由於 j = 4.不符合迴圈條件。則此時,將左邊陣列中的 (剩下的元素)放到臨時陣列中。
while
(i <= mid)
while
(j <= right)
//將臨時陣列按原來陣列中的下標,放入原數姐中。
for(
int k =
0; k < temp.length; k++
)}
上述**其實就是實現了圖中的 7 - 8的步驟。
接下來,我們需要實現上圖中的 1-6的步驟。
現給定的乙個陣列a [left…right],其中,left 與 right 分別為陣列的下標。
1、如果 left >= right ,則該陣列中至多只有乙個元素,已排序。
2、若 left < right ,將原陣列分為前後兩部分。計算中間座標的位置 mid,簡單可設定為 (left + right) /2 ;
則原陣列分為 a[left …mid],a[mid +1, right]。
3、如果 a[left …mid],a[mid +1, right] 中的元素大於1(也就是不滿足一,繼續 2 ,3)。
則實現如下:
/**
* * @param a 陣列
* @param left 起始下標
* @param right 終止下標
*/public
static
void
mergesort
(int
a,int left,
int right)
}
測試**:
int
a =;mergesort
(a,0
, a.length -1)
;
輸出:
1,1
,2,4
,4,5
,5,6
,7,7
,7,8
,8,9
,10,11
,13,18
,20,24
,56,66
,78,131
,234
,1234
,11111
,
演算法 排序演算法
內部排序 插入排序 思想 將n個陣列看成乙個有序表和乙個無序表,開始時有序表只有乙個元素,排序過程是每次取出無序表中的第乙個元素,將它的排序碼與有序表中元素的排序碼進行比較,將其放在合適的位置 public static void insertsort int array array inserti...
排序演算法 排序演算法彙總
排序演算法無疑是學習資料結構中的重點內容,本文將給出排序演算法的彙總。下面是具體的實現 include include include define n 1000000 int array n int temp n 1 氣泡排序 void bubblesort int a,int n if tag ...
排序演算法 排序演算法彙總
排序演算法無疑是學習資料結構中的重點內容,本文將給出排序演算法的彙總。下面是具體的實現 include include include define n 1000000 int array n int temp n 1 氣泡排序 void bubblesort int a,int n if tag ...