一 遞迴 :
/** 遞迴版本
* 採用分治的方法,將n個元素自頂向下分成兩個n/2的子問題, 再將子問題進行劃分,
* 最終將整個問題分解成每個字表長度為 1 的有序表,然後自底向上成對歸併。
**/#include int b[100]; //中間過程陣列
void merge(int a, int low, int mid, int high)
while (i <= mid) b[k++] = a[i++];
while (j <= high) b[k++] = a[j++];
// 將已有序的資料b[0,k-1]拷貝到a[low,high]中
for (i = low,j=0; i <= high; i++,j++)
}void mergesort(int a, int low, int high)
}int main();
//8個元素
int n = 8;
mergesort(a, 0, n - 1);
for (int i = 0; i < n; i++)
printf("\n");
return 0;
}
二 非遞迴:
整個思想如下圖,和遞迴方法思想是一致的。
/** 非遞迴版本
* 同樣對資料進行劃分,每一趟從左到右,從上到下,依次歸併
* merge()函式和遞迴版本一樣。主要區別在於mergesort()裡的每次步長的計算和歸併。
**/#include int b[100]; //中間過程陣列
void merge(int a, int low, int mid, int high)
while (i <= mid) b[k++] = a[i++];
while (j <= high) b[k++] = a[j++];
// 將已有序的資料b[0,k-1]拷貝到a[low,high]中
for (i = low,j=0; i <= high; i++,j++)
}void mergesort(int a,int n)
merge(a,low, mid, high);
low = high + 1; //按照上圖 ,從左到右
} step *= 2; //按照上圖 ,從上到下 }}
int main();
//8個元素
int n = 8;
mergesort(a,n - 1);
for (int i = 0; i < n; i++)
printf("\n");
return 0;
}
歸併排序 遞迴 非遞迴
首先簡單的介紹一下歸併演算法的核心思想 將我們將一組資料分成若干個組,即分到每組資料為1個元素的情況下就不用分了,然後在分別比較每兩組資料元素的大小,將其合併為一組資料再去和其他同等級別的組的資料元素取比較,然後合併到臨時的空間中然後在複製給原空間,依此類推,直到最後全部合併完畢,陣列就成為一組有序...
歸併排序(遞迴 非遞迴 自然歸併排序)
演算法思想 歸併排序是分治法的典型應用,其思想是不斷地將兩個有序的陣列合併為乙個有序陣列。遞迴實現 include void merge int a,int left,int m,int right void mergesortaux int a,int left,int right void me...
遞迴和非遞迴實現歸併排序
1 遞迴實現歸併排序 遞迴排序其實也是利用了完全二叉樹的結構形式,所以時間複雜度和logn掛鉤的。具體遞迴版的歸併排序呢,看下面的 public class ms print s mergesort s system.out.println 排序後的陣列 print s public static ...