經典演算法 陣列排序 Sort an Array Leetcode #912

更新於 2024/09/20閱讀時間約 4 分鐘
raw-image

題目敘述  Sort an Array

這題就是經典的考排序驗算法,不管在教科書、上機考、面試白板題都是一個很基本又滿熱門的題目。

題目會給定一個輸入陣列,要求我們實作一個排序演算法,把陣列元素從小到大排好。


測試範例

Example 1:

Input: nums = [5,2,3,1]
Output: [1,2,3,5]
Explanation: After sorting the array, the positions of some numbers are not changed (for example, 2 and 3), while the positions of other numbers are changed (for example, 1 and 5).

Example 2:

Input: nums = [5,1,1,2,0,0]
Output: [0,0,1,1,2,5]
Explanation: Note that the values of nums are not necessairly unique.

約束條件

Constraints:

  • 1 <= nums.length <= 5 * 10^4

陣列長度介於1~五萬之間。

  • -5 * 10^4 <= nums[i] <= 5 * 10^4

陣列元素都介於 負五萬 ~ 正五萬 之間。


演算法 採用較佳的O( n logn ) 演算法


題目已經明言規定不可以呼叫程式語言或者平台內建的sort function,就是要求我們真正實作一個upper bound為O( n log n)的排序演算法。

考慮到退化的關係,QuickSort會在最差情況會退到O( n^2 )。


註: 退化的意思就是,Worst case發生在當所有element 都已經排好,或者逆序排好,或者陣列元素都相同的時候。


所以本題我們選擇Merge Sort來實作,Merge sort 即使在最差情況 worst case依然能保障O( n log n)的complexity upper bound 。


程式碼 較佳的O( n logn ) MergeSort演算法

class Solution:
 def sortArray(self, nums: List[int]) -> List[int]:
  
  # Use divide and conquer strategy with mergesort
  def mergeSort(left, right):

   if left >= right:
    # only one element, no need to sort
    # invalid interval, no need to sort
    return
   
   # Divide :
   mid = left + (right - left) // 2
   mergeSort( left , mid )
   mergeSort( mid+1, right)

   # Conquer, also known as merge
   a, b = left, mid+1
   merging = []
   
   # Two way merge between left half and right half
   while a <= mid and b <= right:

    if nums[a] < nums[b]:
     merging.append( nums[a] )
     a += 1
    else:
     merging.append( nums[b] )
     b += 1

   # Only left half remains
   while a <= mid:
    merging.append( nums[a] )
    a += 1

   # Only right half remains
   while b <= right:
    merging.append( nums[b] )
    b += 1

   # Write back to originally specific interval
   nums[left : right+1] = merging

   return

複雜度分析

時間複雜度:

O( n log n),至多 log n 層,每層merge又耗費O(n)去合併左半部和右半部子陣列。


空間複雜度:

O( n ) 合併時耗費O(n)的輔助空間去儲存merge完的結果


Reference:

[1] Python O( n log n) by merge sort — Sort an Array — LeetCode

avatar-img
90會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目會給定我們一個陣列,還有一個整數值x 問我們每次從陣列頭部或尾部取一個整數,最少需要幾次才能使取出的整數總和為x?
題目會給定一顆二元樹的根結點,要求我們驗證這一顆樹是否為合法的二元搜索樹, 也就是所謂的Binary search tree, aka BST?
題目會給我們一個輸入陣列,長度為n+1。 陣列裡面會有n+1個數字,數字的範圍從1到n 裡面恰好有一個數字重複出現,要求我們找出那個重複的數字。 題目要求只能使用常數空間O(1),並且限制不能修改陣列內容。
題目會給定給我們一顆二元樹的根結點,要求我們輸出Level-order traversal的拜訪結果。 在這題,我們會複習並利用BFS模板,來實現逐層搜索演算法。
其實常見的tree traversal (前序、中序、後序拜訪), 背後的核心觀念都是相同的。 Tree traversal其實就是探索整顆樹的搜索空間,也可以說是探索整顆樹, 只是指定順序略有不同而已。 本文將結合經典的DFS模板,做一個全面性的回顧。
題目會給定我們一個陣列,還有一個整數值x 問我們每次從陣列頭部或尾部取一個整數,最少需要幾次才能使取出的整數總和為x?
題目會給定一顆二元樹的根結點,要求我們驗證這一顆樹是否為合法的二元搜索樹, 也就是所謂的Binary search tree, aka BST?
題目會給我們一個輸入陣列,長度為n+1。 陣列裡面會有n+1個數字,數字的範圍從1到n 裡面恰好有一個數字重複出現,要求我們找出那個重複的數字。 題目要求只能使用常數空間O(1),並且限制不能修改陣列內容。
題目會給定給我們一顆二元樹的根結點,要求我們輸出Level-order traversal的拜訪結果。 在這題,我們會複習並利用BFS模板,來實現逐層搜索演算法。
其實常見的tree traversal (前序、中序、後序拜訪), 背後的核心觀念都是相同的。 Tree traversal其實就是探索整顆樹的搜索空間,也可以說是探索整顆樹, 只是指定順序略有不同而已。 本文將結合經典的DFS模板,做一個全面性的回顧。
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
隨著遠端工作成為常態,打造一個兼具功能性與美感的家庭辦公室已成為提升工作效率的關鍵。經典家庭辦公室設計強調優雅、舒適與實用性的結合,是許多人心目中的理想選擇。在這篇文章中,我們將透過一個經典家庭辦公室的示意圖,展示如何將永恆的設計元素與現代功能完美融合。
Thumbnail
我:“小杯 經典冰拿鐵1杯” 店員:“冰拿鐵沒有小杯的”
Thumbnail
Leetcode 精選75題 題目與題解 熱門考點 目錄 (持續更新中) 建議從左側目錄 或者 按Ctrl+F輸入關鍵字進行搜尋
Thumbnail
這題就是經典的考排序驗算法, 不管在教科書、上機考、面試白板題都是一個很基本又滿熱門的題目。 題目會給定一個輸入陣列,要求我們實作一個排序演算法,把陣列元素從小到大排好。
Thumbnail
「注意力錯覺」,又稱之為「不注意視盲(Inattentional Blindness)」,是指當人們注意力集中在視覺領域中的某一物件時,其他刺激(尤其是額外、不預期的物體)出現,很容易被忽略。人們自以為能夠意識到所有的訊息,事實上,人們往往對於一些同時發生或存在的資訊視而不見,聽而不聞。
Thumbnail
如何分析一檔股票?這個題目實在是有點沉重,而且想要回答這個問題似乎是不自量力的感覺!因為已經有許多投資大師的理論可供參考了,小弟憑什麼在此說嘴呢? 其實我沒有要跟投資大師比美之意,只是發現到周遭許多人情願去問明牌也不願好好地製作屬於自己的個股分析報告!
Thumbnail
總是嚮往歐洲國家的典雅建築,又或者是羨慕歐洲街道旁的露天吧台坐著優雅的人們呢?如果你也想體驗這種歐洲氣息卻又不想飛越大陸或花大筆鈔票,那就一定要來澳門!這7個地方不僅觀光客,就連在地人也超推薦的夢幻景點,葡式建築、夢幻童話國度,各種歐式風情讓你一次體驗個夠!
Thumbnail
現在的球鞋文化是越創新、華麗越好,但 1970 年代時,運動品牌巨擎 Nike 才剛起步,諸多開山鼻祖經典鞋款雖然簡單,卻比現在的鞋更加迷人,更加經得起時間的考驗,你還不快來看看這篇「Nike 70's」欄目?
Thumbnail
<p>這份「科幻電影一百筆」,是以「年份」做排列,而不是名次。因為是由年份排列,因此能夠看出科幻電影由二十世紀初期至今的發展與成長。發現幾個有趣現象:1. 如果你是由 2010 年之後,才開始關注科幻電影,一點也不嫌太晚,因為最好看的科幻電影,在 2010 年之後,大約就佔有將近一半之多(53/122)。科幻最興盛之時,大概是由 2014 開始,如果你是由 2014 才開始看,也已經看了將近 1/3(37/122)。若是你是由21世紀開始,才關注科幻,幾乎已經可謂專家了,因為至少已經看過 2/3(79/122)。</p>
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
隨著遠端工作成為常態,打造一個兼具功能性與美感的家庭辦公室已成為提升工作效率的關鍵。經典家庭辦公室設計強調優雅、舒適與實用性的結合,是許多人心目中的理想選擇。在這篇文章中,我們將透過一個經典家庭辦公室的示意圖,展示如何將永恆的設計元素與現代功能完美融合。
Thumbnail
我:“小杯 經典冰拿鐵1杯” 店員:“冰拿鐵沒有小杯的”
Thumbnail
Leetcode 精選75題 題目與題解 熱門考點 目錄 (持續更新中) 建議從左側目錄 或者 按Ctrl+F輸入關鍵字進行搜尋
Thumbnail
這題就是經典的考排序驗算法, 不管在教科書、上機考、面試白板題都是一個很基本又滿熱門的題目。 題目會給定一個輸入陣列,要求我們實作一個排序演算法,把陣列元素從小到大排好。
Thumbnail
「注意力錯覺」,又稱之為「不注意視盲(Inattentional Blindness)」,是指當人們注意力集中在視覺領域中的某一物件時,其他刺激(尤其是額外、不預期的物體)出現,很容易被忽略。人們自以為能夠意識到所有的訊息,事實上,人們往往對於一些同時發生或存在的資訊視而不見,聽而不聞。
Thumbnail
如何分析一檔股票?這個題目實在是有點沉重,而且想要回答這個問題似乎是不自量力的感覺!因為已經有許多投資大師的理論可供參考了,小弟憑什麼在此說嘴呢? 其實我沒有要跟投資大師比美之意,只是發現到周遭許多人情願去問明牌也不願好好地製作屬於自己的個股分析報告!
Thumbnail
總是嚮往歐洲國家的典雅建築,又或者是羨慕歐洲街道旁的露天吧台坐著優雅的人們呢?如果你也想體驗這種歐洲氣息卻又不想飛越大陸或花大筆鈔票,那就一定要來澳門!這7個地方不僅觀光客,就連在地人也超推薦的夢幻景點,葡式建築、夢幻童話國度,各種歐式風情讓你一次體驗個夠!
Thumbnail
現在的球鞋文化是越創新、華麗越好,但 1970 年代時,運動品牌巨擎 Nike 才剛起步,諸多開山鼻祖經典鞋款雖然簡單,卻比現在的鞋更加迷人,更加經得起時間的考驗,你還不快來看看這篇「Nike 70's」欄目?
Thumbnail
<p>這份「科幻電影一百筆」,是以「年份」做排列,而不是名次。因為是由年份排列,因此能夠看出科幻電影由二十世紀初期至今的發展與成長。發現幾個有趣現象:1. 如果你是由 2010 年之後,才開始關注科幻電影,一點也不嫌太晚,因為最好看的科幻電影,在 2010 年之後,大約就佔有將近一半之多(53/122)。科幻最興盛之時,大概是由 2014 開始,如果你是由 2014 才開始看,也已經看了將近 1/3(37/122)。若是你是由21世紀開始,才關注科幻,幾乎已經可謂專家了,因為至少已經看過 2/3(79/122)。</p>