two pointers 歸併排序 快速排序問題

2021-09-20 06:31:13 字數 1252 閱讀 3003

概念:two pointers廣義上概念就是利用問題本身與序列的特性,利用下標i、j對序列進行掃瞄,以較低的複雜度來解決問題,其實也不太像是一種演算法,說來可以看做是一種程式設計技巧,一種思想比較適合。

例如在乙個遞增序列中找到a+b=c的數然後輸出a,b的值,c是我們自己指定的數,常規做法很容易想到,兩個下標遍歷序列做個二重迴圈就可以解決問題,時間複雜度為o(n^2),但是這個方法是比較爛的,當序列數字較多時時間複雜度會非常的高,程式可行性大打折扣,這時候就要另闢蹊徑。

加入現在定義i為a序列首位,j為a序列末位,兩下標往中間移動,設計while迴圈終止條件(i>=j)即可,然後比對是否存在滿足條件的i,j然後進行輸出。如果此時已經找到乙個a[i]+a[j]=c,想要繼續分析找到合適的i和j,下一步應該如何選擇才能更加的高效,顯然可以從給出的背景條件來看,由a序列是個遞增序列可以知道,如果在找到的上述a[i]+a[j]=c條件下將i單獨後移顯然結果大於c的,而將j前移顯然後來的結果都是小於c的,所以下乙個查詢區間應該[i+1,j-1]開始。再如果找到的a[i]+a[j]>c,顯然此時如果將i後移這個結果只會繼續增加,所以下乙個查詢區間應該只會在[i,j-1]內,反之同樣成立。說的有點模糊,但請好好分析下,這個思想應該是不太難的,用此方法實現複雜度顯然降低不少,此時複雜度為o(n),實現的偽**如下:

while(i歸併排序是一種比較特殊的排序,因為它不僅可以存在於內排序中,它也是外排序的基本方法,使用範圍較廣,在磁碟排序中也有很多應用,最基本的歸併就是二路歸併,其實不然也可以進行k路歸併,思路都是一樣的,下面對二路歸併進行詳解。

二路歸併是將乙個序列兩兩進行分組,每個組內進行排序,然後再將這些組組兩兩歸併,兩個組合並並排序,從上到下的**如下:

思路不是很難,實現方法難點就在於序列的合併問題了,其實在鍊錶裡面這種序列合併並使其遞增是個司空見慣的操作了,在歸併排序裡面只不過就是乙個嵌入的方法了,基本思想不變,比較a[i],b[j]的大小,兩個都是各自序列裡面的首位,取較小者加入到新序列中,並將對應的下標增加即可,遞迴實現方法如下:

const max=100;

void mergesort(int a,int l1,int r1,int l2,int r2)

a[left]=k; //基準元素放回

return left;

}void quicksort(int a,int left,int right)

}

歸併排序(2 路歸併排序)

遞迴寫法 include define maxn 100 void merge int a,int l1,int r1,int l2,int r2 將陣列a的區間 l1,r1 和區間 l2,r2 合併為乙個有序區間 else while i r1 while j r2 for int i 0 i非遞...

python歸併排序 python 歸併排序

排序思路 1.將陣列分成兩組a,b,建立臨時陣列 c,c長度 a b 2.i,j分別屬於a,b 3.若a i b j 將b j 放入c,j 否則 a i 放入c,i 4.迴圈3步驟,將a或b中剩餘的元素放入c,再將c複製到陣列中 5.遞迴3 4直到a,b序列的長度 1 歸併排序 class merg...

排序 歸併排序

歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。歸併 將兩個已經排好序的集合合併到乙個集合眾,並且保證新的集合也是有序的。核心點 只有乙個元素的集合是已經排好序的集合。歸併排序是建立在...