演算法導論讀後感 選取陣列中的第X小(大)的元素

2021-08-10 15:58:24 字數 1407 閱讀 3191

通常,如果需要選取某個陣列中第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則是我閱讀的第一本關於敏捷方面的書。在閱讀本書之前,我閱讀了一些關於敏捷實踐方...