演算法導論第九章 中位數和順序統計量

2021-06-26 15:35:29 字數 1770 閱讀 7793

9.1 最小值和最大值
//遍歷陣列,線性時間求最小值

int minimun(int *a)

//兩兩相比,3n/2次比較即可求最小值和最大值

void minandmax(int *a,int &min, int &max)

//如果n是偶數

else

//成對地處理餘下的元素

for(; i <= length_a; i=i+2)

}

9.2 期望為線性時間的選擇演算法

//期望為線性時間的選擇演算法

//快速排序,下標p到i的數都比a[r]小,i+1到j-1都比a[r]大,當j比r小時,把a[i+1]與a[j]交換,維持前述的性質

//最後交換i+1與r,那麼r的位置即可正確找到(前面的都比它小,後面的都比它大)

//返回的數是已經正確排好位置的元素的下標

int partition(int *a, int p, int r)

} swap(a[i+1], a[r]);

return i+1;

}//隨機選擇陣列中乙個數作為主元,返回的數是已經正確排好位置的元素的下標

int randomized_partition(int *a, int p, int r)

//函式返回陣列中第i小的元素。i是從1開使計數的,不是從p開始

int randomized_select(int *a, int p, int r, int i)

9.3 最快情況為線性時間的選擇演算法

//最壞情況為線性時間的選擇

//對每一組從start到end進行插入排序,並返回中值

//插入排序很簡單,不解釋

int insert(int *a, int start, int end, int k)

} }return a[start+k-1];

}//根據文中的演算法,找到中值的中值

int find(int *a, int p, int r)

} //對這個陣列以遞迴呼叫select()的方式尋找中值

int ret = select(b, 1, j, (j+1)/2);

//delete b; //很奇怪,這句話應該是沒問題的,但是怎麼一執行到這句話就宕機呢?

return ret;

}//以f為主元的劃分

int partition2(int *a, int p, int r, int f)

} return partition(a, p, r);

}//尋找陣列a[p..r]中的第i大的元素,i是從1開始計數,不是從p開始

int select(int *a, int p, int r, int i)

int main()

{ cin>>length_a;

int *a = new int[length_a+1], i, cnt;

//生成測試資料

for(i = 1; i <= length_a; i++)

a[i] = rand() % 100;

cin>>cnt;

//顯示測試資料

print(a);

//輸出結果

if(cnt <= length_a)

cout<

**:

演算法導論 第九章 中位數和順序統計量

def 第i個順序統計量,是該集合中第i小的元素。def 選擇問題 輸入,乙個包含n個數的集合a,和乙個整數i,1 i n。輸出,元素x屬於a,且a中恰好有i 1個其他元素小於它。9.1 最大值和最小值 尋找乙個陣列中的最大值和最小值需要經過n 1次比較找到 def minimum a mini a...

《演算法導論》筆記系列之第九章中位數和順序統計量

在乙個由n個元素組成的集合中,第i個順序統計量,是該集合中第i小的元素。9.1討論了陣列的最小值和最大值。如果要找出陣列的最小值,可以通過至多n 1次比較得出。最大值相同。但若要求同時找出最大值和最小值呢?可以採用9.1介紹的方法。就是不是將元素與最小值或最大值相比,而是將陣列的元素成對處理,先將兩...

演算法導論學習筆記 第九章 中位數和順序統計學

總結 這一章講了找最大值 最小值的方法,介紹了以期望線性時間找第 i小的數的方法,以及以最壞情況線性時間找第 i小的數的方法。1.最大值和最小值 找最小值,遍歷一遍即可 偽 minimum a min a 1 for i 2 to length a do if min a i then min a ...