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 ...