排序演算法總結(二)

2021-07-30 15:39:05 字數 1956 閱讀 1957

歸併排序演算法思想是分而治之。下面將對分而治之演算法排序做乙個簡單描述。

//歸併排序之分而治之

void sort(e, n)

else

對e插入排序

}

當k=2的時候,分而治之的排序演算法稱之為歸併排序,嚴格的來說是二路歸併排序,它的空間複雜度是o(n),時間複雜度為o(nlogn)。

歸併排序函式用乙個陣列a來儲存元素序列e,並用a飯後排序後的序列。當序列e被劃為2個子序列時,不必把他們分別複製到a和b中,只需要簡單的記錄他們在序列e中的左右邊界。然後將拍薰後的子串行歸併到乙個新的陣列b中去,最後再將它們賦值回a中。簡明的演算法如下:、

void mergesort(t *a, int left, int right)

}

仔細觀察這個歸併程式會發現遞迴就是不斷的將序列進行劃分,直到序列的長度變為1,這時在進行歸併,長度為1的子串行被歸併成長度為2的子串行,長度為2的子串行被歸併成長度為4的子串行,如此反覆,直到只剩下乙個有序序列,例子如下;

初始段  [8][4][5][1][3][6][2][7]

歸併到 b [4 8] [1 5] [3 6] [2 7]

複製到 a [4 8] [1 5] [3 6] [2 7]

歸併到 b [1 4 5 8] [2 3 6 7]

複製到 b [1 4 5 8] [2 3 6 7]

歸併到 b [1 2 3 4 5 6 7 8]

輪流的從a歸併到b,從b歸併到a,實際上消除了從b複製到a的過程。

用歸併排序對陣列a[0,n-1]進行排序的最終演算法如下:

templatevoid mergesort(t a, int n)

deleteb;

} //mergepass函式的作用是確定歸併子串行的左右邊界,真實的歸併是在merge中完成

template void mergepass(t x, t y, int n, int segmentsize)

//歸併剩餘元素

if (first>endoffirst)

for (int q = sencond; q <= endofsencond; q++)

d[result++] = c[q]; //當歸並序列的左邊全不大於右邊

else

for (int q = first; q < endoffirst; q++)

}

//法二

templatevoid merge(t data, t result,int start, int mid, int end)

while (i <= mid) //表示陣列data(mid,end]已經全部歸入result陣列中去了,而陣列data[start,mid]還有剩餘

result[k++] = data[i++]; //將陣列data[start,mid]剩下的值,逐一歸入陣列result

while (j <= end) //表示陣列data[start,mid]已經全部歸入到result陣列中去了,而陣列(mid,high]還有剩餘

result[k++] = data[j++]; //將陣列a[mid,high]剩下的值,逐一歸入陣列result

for (i = 0; i < k; i++) //將歸併後的陣列的值逐一賦給陣列data[start,end]

data[start + i] = result[i]; //注意,應從data[start+i]開始賦值

}templatevoid merge_sort(t data, t result, int start, int end)

}

排序演算法總結(二)

歸併排序 歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。我們一般取中位數,將前後兩部分排序在歸併為乙個序列,遞迴完成。include using namespace std void...

排序演算法總結 二

排序演算法是一種基本並且常用的演算法。由於實際工作中處理的數量巨大,所以排序演算法對演算法本身的速度要求很高。而一般我們所謂的演算法的效能主要是指演算法的複雜度,一般用o方法來表示。在後面我將給出詳細的說明。對於排序的演算法我想先做一點簡單的介紹,也是給這篇文章理乙個提綱。我將按照演算法的複雜度,從...

排序演算法 總結 思考(二)

寫排序演算法總是計算機招聘筆試面試必考,也最檢驗考基礎能力的題 續前一篇介紹其他四種排序演算法 5.輪輪選拔 氣泡排序 bubble sort 氣泡排序也是原理比較好懂,但是實現效率不高的排序方法之一,比較適合初學者熟悉理解演算法的過程 冒泡 本身就是乙個很形象的比喻。在此排序演算法中,每一輪會前後...