歸併排序 遞迴和非遞迴

2021-07-11 08:23:57 字數 1438 閱讀 6536

一  遞迴 :

/**  遞迴版本

* 採用分治的方法,將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 ...