Task 03:數(shù)組排序(day2)

Task 03: 數(shù)組排序

第5天打卡脑奠,附上學(xué)習(xí)鏈接

1 學(xué)習(xí)內(nèi)容

1.1 希爾排序(Shell Sort)

將整個(gè)序列按照一定的間隔取值劃分為若干個(gè)子序列最欠,每個(gè)子序列分別進(jìn)行插入排序抹估,然后逐漸縮小間隔進(jìn)行下一輪劃分子序列和插入排序政冻,直至最后一輪排序間隔為1的止,對(duì)整個(gè)序列進(jìn)行插入排序座云。

算法步驟:

  • (1)首先確定一個(gè)元素間隔數(shù)gap发侵,然后將參與排序的序列按此間隔數(shù)從第1個(gè)元素開(kāi)始一次劃分成若干個(gè)子序列,即分別將所有位置相隔為gap的元素視為一個(gè)子序列枫浙,在各個(gè)子序列中采用某種排序方法進(jìn)行插入排序刨肃;

  • (2)然后減少間隔數(shù)古拴,并重新將整個(gè)序列按新的間隔數(shù)劃分為若干個(gè)子序列,再分別對(duì)各個(gè)子序列進(jìn)行排序真友,如此下去黄痪,直到間隔數(shù)gap=1。

算法分析:

  • 希爾排序方法的速度是一系列間隔數(shù)gapi的函數(shù)盔然;

  • 不穩(wěn)定排序算法

  • 因?yàn)槊看味汲?桅打,向下取整的方式縮小間隔數(shù),對(duì)有n個(gè)元素的序列愈案,若gap1=floor(n/2)挺尾,則經(jīng)過(guò)log2n趟排序后就有g(shù)app=1,所以謝爾排序方法的排序總趟數(shù)為floor(log2n)刻帚;

  • 最外層的while循環(huán)為log2n數(shù)量級(jí)潦嘶,中間層do-while循環(huán)為n數(shù)量級(jí)。當(dāng)子序列分的越多崇众,子序列中的元素越少,最內(nèi)層的for循環(huán)的次數(shù)也就越少航厚;反之當(dāng)分的越少顷歌,子序列的元素也隨之增多,但整個(gè)序列也逐步有序幔睬,而循環(huán)次數(shù)卻不會(huì)隨之增加眯漩。因此,希爾排序算法的時(shí)間復(fù)雜度在O(nlog2n)與O(n2)之間麻顶。

代碼實(shí)現(xiàn):

def shellSort(arr):
 size = len(arr)
 gap = size // 2

 while gap > 0:
 for i in range(gap, size):
 temp = arr[i]
 j = i
 while j >= gap and arr[j-gap] > temp:
 arr[j] = arr[j-gap]
 j -= gap
 arr[j] = temp
 gap = gap // 2
 return arr
1.2 歸并排序(Merge Sort)

采用經(jīng)典的分治策略赦抖,先遞歸地將當(dāng)前序列平均分為兩半,然后將有序序列兩兩合并辅肾,最終合并成一個(gè)有序序列队萤。

算法步驟:

  • (1)初始時(shí),將待排序的序列中的n個(gè)記錄看成n個(gè)有序子序列矫钓,每個(gè)子序列的長(zhǎng)度均為1要尔;

  • (2)把當(dāng)前序列組中有序子序列兩兩歸并,完成一遍之后序列組里的排序序列個(gè)數(shù)減半新娜,每個(gè)子序列的長(zhǎng)度加倍赵辕;

  • (3)對(duì)長(zhǎng)度加倍的有序子序列重復(fù)以上操作,最終得到一個(gè)長(zhǎng)度為n的有序序列概龄。

算法分析:

  • 歸并排序算法的時(shí)間復(fù)雜度等于歸并趟數(shù)與每一趟歸并的時(shí)間復(fù)雜度成績(jī)还惠。子算法merge(left_arr, right_arr):時(shí)間復(fù)雜度為O(n),因此歸并排序算法總的時(shí)間復(fù)雜度為O(nlog2n)私杜;

  • 歸并排序方法需要用到與參加排序的序列同樣大小的輔助空間蚕键,所以空間復(fù)雜度為O(n)互拾;

  • 因?yàn)樵趦蓚€(gè)有序子序列的歸并過(guò)程中,如果兩個(gè)有序序列中出現(xiàn)相同元素嚎幸,merge(left_arr, right_arr):算法能夠使前一個(gè)序列中那個(gè)相同元素先被復(fù)制颜矿,從而確保這兩個(gè)元素的相對(duì)次序不發(fā)生改變,所以是穩(wěn)定排序算法嫉晶。

代碼實(shí)現(xiàn):

def merge(left_arr, right_arr):
    arr = []
    while left_arr and right_arr:
        if left_arr[0] <= right_arr[0]:
            arr.append(left_arr.pop(0))
        else:
            arr.append(right_arr.pop(0))
            
    while left_arr:
        arr.append(left_arr.pop(0))
    while right_arr:
        arr.append(right_arr.pop(0))
    return arr

def mergeSort(arr):
    size = len(arr)
    if size < 2:
        return arr
    mid = len(arr) // 2
    left_arr, right_arr = arr[0:mid], arr[mid:]
    return merge(mergeSort(left_arr), mergeSort(right_arr))

2 練習(xí)題目

2.1 0506 相對(duì)名次 *

題目描述:給出N名運(yùn)動(dòng)員的成績(jī)骑疆,找出他們的相對(duì)名次并授予前三名對(duì)應(yīng)的獎(jiǎng)牌。前三名運(yùn)動(dòng)員將會(huì)被分別授予”金牌“替废,”銀牌“和”銅牌"("Gold Medal"箍铭, "Silver Medal", ”Bronze Medal“)椎镣,注:分?jǐn)?shù)越高的選手诈火,排名越靠前。所有運(yùn)動(dòng)員的成績(jī)都不相同状答。 樣例1:輸入為[5, 4, 3, 2, 1]冷守,輸出為["Gold Medal", "Silver Medal", "Bronze Medal", "4", "5"]。

解題思路:先實(shí)現(xiàn)降序排列惊科,然后構(gòu)建分?jǐn)?shù)和名詞的字典拍摇,最后根據(jù)原score找出結(jié)果即可。

class Solution:
    def findRelativeRanks(self, score: List[int]) -> List[str]:
        score_sort = sorted(score, reverse=True)
        rank_list = ["Gold Medal", "Silver Medal",
                     "Bronze Medal"]+[str(i+4) for i in range(len(score)-3)]
        dic = dict(zip(score_sort, rank_list))
        res = [dic.get(i) for i in score]
        return res
2.2 面試題 10.01 合并排序的數(shù)組 **

題目描述:給定兩個(gè)排序后的數(shù)組A和B馆截,其中A的末端有足夠的緩沖空間容納B充活。編寫(xiě)一個(gè)方法,將B合并入A并排序蜡娶。初始化A和B的元素?cái)?shù)量分別為m和n混卵。 樣例1:輸入為A=[1, 2, 3, 0, 0, 0], m=3, B=[2, 5, 6], n=3,輸出為[1, 2, 2, 3, 5, 6]窖张。

解題思路:先將數(shù)組B放進(jìn)數(shù)組A的尾部幕随,然后直接對(duì)整個(gè)數(shù)組進(jìn)行排序。

class Solution:
    def merge(self, A: List[int], m: int, B: List[int], n: int) -> None:
        """
        Do not return anything, modify A in-place instead.
        """
        A[m:] = B
        A.sort()

時(shí)間復(fù)雜度:O((m+n)log(m+n))荤堪; 空間復(fù)雜度:O(log(m+n))合陵。

雙指針的思想 妙呀
將兩個(gè)數(shù)組看作隊(duì)列,每次從兩個(gè)隊(duì)列頭部取出較小的數(shù)字放入結(jié)果澄阳。

class Solution:
    def merge(self, A: List[int], m: int, B: List[int], n: int) -> None:
        """
        Do not return anything, modify A in-place instead.
        """
        sorted = []
        pa, pb = 0, 0  # 使用pa和pb來(lái)作為隊(duì)列的頭部指針
        while pa < m or pb < n:
            if pa == m:
                sorted.append(B[pb])
                pb += 1
            elif pb == n:
                sorted.append(A[pa])
                pa += 1
            elif A[pa] < B[pb]:
                sorted.append(A[pa])
                pa += 1
            else:
                sorted.append(B[pb])
                pb += 1
         A[:] = sorted

時(shí)間復(fù)雜度:O(m+n)拥知; 空間復(fù)雜度:O(m+n)。

2.3 劍指Offer 51 數(shù)組中的逆序?qū)?***

題目描述:在數(shù)組中的兩個(gè)數(shù)字碎赢,如果前面一個(gè)數(shù)字大于后面的數(shù)字低剔,則這兩個(gè)數(shù)字組成一個(gè)逆序?qū)Α]斎胍粋€(gè)數(shù)組,求出這個(gè)數(shù)組中的逆序?qū)Φ目倲?shù)襟齿。 樣例1:輸入為[7, 5, 6, 4]姻锁,輸出為5。

解題思路:思考中猜欺。位隶。。开皿。理不清涧黄。。赋荆。笋妥。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市窄潭,隨后出現(xiàn)的幾起案子春宣,更是在濱河造成了極大的恐慌,老刑警劉巖嫉你,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件月帝,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡均抽,警方通過(guò)查閱死者的電腦和手機(jī)嫁赏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)油挥,“玉大人,你說(shuō)我怎么就攤上這事款熬∩盍龋” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵贤牛,是天一觀的道長(zhǎng)惋鹅。 經(jīng)常有香客問(wèn)我,道長(zhǎng)殉簸,這世上最難降的妖魔是什么闰集? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮般卑,結(jié)果婚禮上武鲁,老公的妹妹穿的比我還像新娘。我一直安慰自己蝠检,他們只是感情好沐鼠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般饲梭。 火紅的嫁衣襯著肌膚如雪乘盖。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,365評(píng)論 1 302
  • 那天憔涉,我揣著相機(jī)與錄音订框,去河邊找鬼。 笑死兜叨,一個(gè)胖子當(dāng)著我的面吹牛穿扳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播浪腐,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼纵揍,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了议街?” 一聲冷哼從身側(cè)響起泽谨,我...
    開(kāi)封第一講書(shū)人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎特漩,沒(méi)想到半個(gè)月后吧雹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涂身,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年雄卷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛤售。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡丁鹉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出悴能,到底是詐尸還是另有隱情揣钦,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布漠酿,位于F島的核電站冯凹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏炒嘲。R本人自食惡果不足惜宇姚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望夫凸。 院中可真熱鬧浑劳,春花似錦、人聲如沸寸痢。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至道逗,卻和暖如春兵罢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背滓窍。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工卖词, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吏夯。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓此蜈,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親噪生。 傳聞我的和親對(duì)象是個(gè)殘疾皇子裆赵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容