首先,歸併排序,分治。遞迴解決小的範圍。再合併兩個有序的小範圍陣列,便得到整個有序的陣列。
這是非常適合用遞迴來寫的。至於非遞迴。便是從小到大。各個擊破,從而使得整個陣列有序。**例如以下:
void merge(vector&a, int left, int mid, int right)
while(i<=mid)tmp[k++]=a[i++];
while(j<=right)tmp[k++]=a[j++];
//write to a
for(int i=0;i&a)
step *= 2;
}}
對於高速排序的非遞迴版本號,因為高速排序的每一步都是依據乙個pivot將陣列分為兩個部分,一部分大於pivot,一部分小於pivot,也就是每一步都確定了pivot終於在有序陣列中的位置,那麼這就非常自然地能夠對兩個部分各自使用遞迴就可以,對於非遞迴。則使用棧來實現。棧中記錄的是每乙個子陣列的範圍就可以,於是,**為:
int partition(vector&a, int left, int right)
}
寫習慣了這兩種排序的遞迴版本號,此處的非遞迴版本號確實不是那麼自然而然的,可是僅僅要記住遞迴的版本號一定能夠使用棧來模擬遞迴的過程,那麼我們相同能夠實現非遞迴的版本號,此文就是乙份備忘吧。
歸併排序(遞迴 非遞迴 自然歸併排序)
演算法思想 歸併排序是分治法的典型應用,其思想是不斷地將兩個有序的陣列合併為乙個有序陣列。遞迴實現 include void merge int a,int left,int m,int right void mergesortaux int a,int left,int right void me...
歸併排序 非遞迴
static void merging sort beta int a 歸併排序演算法 非遞迴 static void mergepass int source,int temp,int gap,int len if i len gap else static void merge beta int...
歸併排序(非遞迴)
接著上篇文章歸併排序 遞迴 來 下,歸併排序的非遞迴實現。歸併排序的非遞迴實現 1 將兩個相鄰的有序序列歸併成乙個有序序列,我們稱為 一次歸併 2 一趟歸併 是多次執行 一次歸併 的結果。在 一趟歸併 中,除最後乙個有序序列外,其他有序序列中記錄的個數 稱為序列長度 相同,用h表示。現在的任務是把若...