通常,如果需要選取某個陣列中第x小(大)的元素,我們可以使用簡單選擇排序遍歷x遍陣列,每一遍遍歷可以得到乙個最小的元素,這樣演算法的複雜度為 o(n2)。或者,我們可以使用更高效的快速排序演算法,排序完成後,直接取第x位置的元素,這樣,演算法的複雜度為o(nlgn)。
這裡,我們學習一種更高效的演算法,利用這一演算法,其期望的平均演算法複雜度為線性複雜度。
該演算法的核心思想是利用快速排序中每一部的分割,在將陣列分割為2部分後,自然,前半部分的所有元素都不大於key,而後半部分的所有元素都不小於key。這樣,優勢在於:每次分割後,只需要關注一半的元素,而另一半不需要繼續分割與排序。
可以看到,在selectxthminvalue函式中,只需要根據陣列中元素的個數來判斷應該關注key前面的部分或key後面的部分陣列即可。
演算法核心**如下:
#ifndef _random_select_h_
#define _random_select_h_
class randomselect
;#endif
#include "randomselect.h"
randomselect::randomselect()
randomselect::~randomselect()
int randomselect::selectxthminvalue(int *a, int xth, int
length)
}int randomselect::selectxthmaxvalue(int *a, int xth, int
length)
}bool randomselect::validinputparams(int *a, int xth, int
length)
if (xth > length)
return rs;
}int randomselect::selectxthminvalue(int* a, int p, int r, int xth)
else
if (k < xth)
else
}int randomselect::selectxthmaxvalue(int *a, int p, int r, int xth)
else
if (k < xth)
else
}int randomselect::partition(int* a, int p, int r)
else
//swap p pointer and key
}while (p <= r)
else
//swap r pointer and key}}
return keyindex;
}
演算法導論讀後感 之紅黑樹的性質
紅黑樹是具有下列性質的二叉搜尋樹 1.每個節點或是紅色的,或是黑色的。2.根節點是黑色的。3.每個葉節點 nil 是黑色的。注意,這裡的葉節點均為外部節點。4.如果乙個節點是紅色的,則它的兩個子節點都是黑色的。5.對每個節點,從該節點到其所有後代的簡單路徑上,均包含相同數目的黑色節點。從某個節點x出...
《指導生活的演算法》讀後感
演算法時刻陪伴在程式設計師身邊,無論是專業的演算法工程師,還是公司基礎的業務人員,在工作中都會或多或少接觸演算法思維,並用改進的演算法優化系統,而演算法同樣可以用來指導我們的實際生活。近期閱讀了 指導生活的演算法 人類決策中的電腦科學 全名 algorithms to live by the com...
《硝煙中的Scrum與XP》讀後感
在很久很久之前,我就聽說了敏捷開發的大名,也聽到過諸多成功人士對於scrum與xp方法的讚譽。只是由於我個人的一些原因,一直沒抽出時間去拜讀這些名著。直到最近,我才有機會去閱讀敏捷開發相關的資料,而硝煙中的scrum與xp則是我閱讀的第一本關於敏捷方面的書。在閱讀本書之前,我閱讀了一些關於敏捷實踐方...