1. 程式人生 > >長度為n無序陣列找屎

長度為n無序陣列找屎

假定這個n的長度為特別大 1…找一個最小數

2.找一個最大數和一個最小數 最笨的方法排序 取最大值,和最小值,所需時間為n2

傻子的辦法 比較法 存兩個臨時變數 第一個臨時變數,一直儲存最小的值,遍歷陣列,遇見比它小的進行交換,複雜度一直為n 另一個臨時變數,則儲存最大值

聰明點的人 兩兩比較法 第一步 首先讓所有的元素參與兩兩比較,這樣總共比較了n/2次,最大數肯定在勝者組中,最小數肯定在敗者組中 第二步 然後從容量為n/2的勝者組中找到最大的數,最少要比較n/2 - 1次;同理,從容量為n/2的敗者組中找到最小的數,最少要比較n/2 - 1次 第三步 同理,從容量為n/2的敗者組中找到最小的數,最少要比較n/2 - 1次。所以總共需要比較(3n/2) - 2 次。以上假設n為偶數。奇數同理。 這是同時尋找最大數和最小數的最優演算法。

3.找第二小的數

傻子的辦法 一種習慣的方法是:先找出最大的元素,這需要比較n-1次;然後從剩下的n-1個元素中找到最大的,這個元素就是我們要找的第二大元素,這需要比較n-2次。做一總共比較2n-3次。

普通人的辦法 還有一個更優的方法: (1) 我們考慮淘汰賽的比較法,淘汰賽結束後,找出冠軍我們需要n-1次比較;如下圖所示,找到12需要比較7次。 (2) 此時我們要考慮到,亞軍應該存在於敗給冠軍的這些選手中(否則,每個元素都至少有兩個元素比它大),由於與冠軍比過的元素個數為┌log2n┐,從這些元素中找到最大值需要比較┌log2n┐ - 1次;如下圖所示,亞軍應該在10,11,4這三個元素中。否則,如果亞軍是5,那麼冠軍12比它大,與它比較過的10也比它大,至少兩個元素大於5,所以5肯定不是亞軍的候選者。 淘汰賽

(3)從而找出亞軍要比較n-1+┌log2n┐-1 = n-2+┌log2n┐次比較。這個演算法是尋找亞軍的最優演算法。

4.找m小的數

5.同時尋找最大數和最小數