遞歸python
1 //二路一次歸併過程的算法 2 //low爲本次二路歸併排序的第1有序區的第1個元素,i指向第1個元素, mid爲第1有序區的最後1個元素 3 void merge(int List[], int low, int mid, int high) 4 { 5 //mid+1爲第2有序區第1個元素,mid爲第1有序區的最後1個元素 6 //i 指向第 1 有序區的第 1 個元素 7 int i = low; 8 //j 指向第 2 有序區的第 1 個元素,high 爲第 2 有序區的最後一個元素 9 int j = mid + 1; 10 //temp數組暫存合併的有序序列 11 int *temp = new int[high - low + 1]; 12 //設置臨時數組的指示標誌 k 13 int k = 0; 14 //內存分配失敗 15 if(!temp){ 16 cout<<"數組分配失敗!"; 17 exit(0); 18 } 19 //順序選取兩個有序區的較小元素,存儲到t數組中,由於是遞增排序 20 while(i <= mid && j <= high){ 21 //較小的元素,存入temp臨時數組中 22 if(List[i] <= List[j]){ 23 temp[k++] = List[i++]; 24 }else{ 25 temp[k++] = List[j++]; 26 } 27 }// end of while 28 //比完以後,假如第1個有序區仍有剩餘,則直接所有複製到 temp 數組 29 while(i <= mid){ 30 temp[k++] = List[i++]; 31 } 32 //比完以後,假如第2個有序區還有剩餘,則直接所有複製到 temp 數組 33 while(j <= high){ 34 temp[k++] = List[j++]; 35 } 36 //將排好序的序列,重存回到 list 中 low 到 high 區間 37 for(i = low, k = 0; i <= high; i++, k++){ 38 List[i] = temp[k]; 39 } 40 //delete [] 刪除動態數組的內存 41 delete []temp; 42 } 43 44 //遞歸實現二路歸併排序(也就是分治法的思想) 45 void mergeSort(int List[], int low, int high) 46 { 47 //二路歸併排序,分爲二路 48 int mid = (low + high) / 2; 49 //終止條件,low >= high, 不是while,且不含等號,不然死循環 50 if(low < high) 51 { 52 //遞歸過程,二路歸併排序遞歸過程 53 mergeSort(List, low, mid); 54 mergeSort(List, mid + 1, high); 55 //歸併 56 merge(List, low, mid, high); 57 } 58 } 59 60 int main(void) 61 { 62 int source[7] = {49, 38, 65, 97, 76, 13, 27}; 63 64 mergeSort(source, 0, 6); 65 66 for (int i = 0; i < 7; i++) { 67 printf(" %d ", source[i]); 68 } 69 70 return 0; 71 }
非遞歸c++
1 //非遞歸算法實現二路歸併排序,length表明數組長度,即數組最大下標是 legth - 1 2 void mergeSort(int List[],int length) 3 { 4 //回憶圖解的過程,二路歸併算法的流程,不一樣於遞歸,遞歸是先遞歸語句,而後歸併函數,這樣歸併函數是倒序執行(和遞歸函數執行順序相反) 5 int size = 1; 6 int low; 7 int mid; 8 int high; 9 //size 是標記當前各個歸併序列的high-low,從1,2,4,8,……,2*size 10 while(size <= length - 1) 11 { 12 //從第一個元素開始掃描,low表明第一個分割的序列的第一個元素 13 low = 0; 14 //當前的歸併算法結束的條件 15 while(low + size <= length - 1) 16 { 17 //mid表明第一個分割的序列的最後一個元素 18 mid = low + size - 1; 19 //high 表明第二個分割的序列的最後一個元素 20 high = mid + size; 21 //判斷一下:若是第二個序列個數不足size個 22 if(high > length - 1){ 23 //調整 high 爲最後一個元素的下標便可 24 high = length - 1; 25 } 26 //調用歸併函數,進行分割的序列的分段排序 27 merge(List, low, mid, high); 28 //打印出每次歸併的區間 29 cout << "low:" << low << " mid:" << mid << " high:" << high << endl; 30 //下一次歸併時第一序列的第一個元素位置 31 low = high + 1; 32 }// end of while 33 //範圍擴大一倍,二路歸併的過程 34 size *= 2; 35 }// end of while 36 }
遞歸算法
非遞歸數組
遞歸app
非遞歸函數
1 def mergeSort(arr): 2 import math 3 if(len(arr)<2): 4 return arr 5 middle = math.floor(len(arr)/2) 6 left, right = arr[0:middle], arr[middle:] 7 return merge(mergeSort(left), mergeSort(right)) 8 9 def merge(left,right): 10 result = [] 11 while left and right: 12 if left[0] <= right[0]: 13 result.append(left.pop(0)); 14 else: 15 result.append(right.pop(0)); 16 while left: 17 result.append(left.pop(0)); 18 while right: 19 result.append(right.pop(0)); 20 return result