資料結構篇_程式設計思想板塊_第七章排序
程式設計思想板塊最主要的內容是資料結構經典題目及解答題目所需的程式設計思想,願對您能有所幫助
七、排序
- 對n個整數進行排序,要求時間複雜度為O(n),空間複雜度為O(1)?
演算法思路:假設待排序整數的範圍為0~65535,設定一個數組int count [65535]並初始化為0,則所需空間與n無關,為0(1)。掃描一遍待排序列x[],count[X[i]]++,時間複雜度為O(n);再掃哦9描一次count[],當count[i]>0時,輸出count[i]個i,排序完畢所需的時間複雜度也為O(n);故總的時間複雜度為O(n),空間複雜度為O(1)。假如有負整數可以給所有整數都加上一個偏移量,使之都變成正整數,再使用上述方法即可
-
若關鍵字型別沒有比較運算子,可事先定義巨集或函式表示比較運算
-
對於判斷是否是大/小根堆的題一般用將順序表視為一個完全二叉樹,此時需對陣列長度分為兩種情況判斷:
① 若len為偶數,則有一個單分支節點,則需先判斷單分支節點再判斷所有雙分支節點
② 反之直接判斷所有雙分支結點
1)答題(畫圖)格式
答題(畫圖)格式 | |
---|---|
直接插入排序 | |
希爾排序 | |
歸併排序 | |
基數排序 | |
快速排序(若題目選取中間結點則寫一句:把其與第一個元素換位再寫下如圖步驟) | |
氣泡排序 | (已排好的數不再寫出) |
堆排序 | (不是畫樹!) |
直接選擇 |
2)折半插入排序
- 注意:
① 一直到low>high才停止查詢
② 當mid所指元素等於當前元素時,應繼續令low=mid+1,以保證“穩定性,最終將當前元素插入到low所指位置(即high+1)- 與折半查詢的不同之處
3)氣泡排序
- 新增判斷是否發生交換元素的flag,若某一次遍歷後沒發生交換則說明表已有序即退出迴圈
4)排序經典題目的程式設計思想
1. 編寫雙向氣泡排序演算法,在正反兩個方向交替進行掃描,即第一趟把關鍵字最大的元素放在序列的最後面,第二趟把關鍵字最小的元素放在序列的最前面,如此反覆進行
演算法思想:
這種排序方法又稱雙向起泡。奇數趟時,從前向後比較相鄰元素的關鍵字,遇到逆序即交換,
直到把序列中關鍵字最大的元素移動到序列尾部。偶數趟時,從後往前比較相鄰元素的關鍵字,遇到逆序即交換,直到把序列中關鍵字最小的元素移動到序列前端
2. 試編寫一個演算法,使之能夠在陣列L[1..n]中找出第k小的元素(即從小到大排序後處於第k個位置的元素)
演算法思想:
從陣列L[1..n]中選擇樞軸pivot (隨機或直接取第一個)進行和快速排序-樣的劃分操作後,表L[1..n]被劃分為Ll[1...m-1] 和L[m+1..n],其中L(m) =pivot
討論m與k的大小關係:
① 當m=k時,顯然pivot就是所要尋找的元素,直接返回pivot即可
② 當m<k時,所要尋找的元素一 定落在L [m1..n]中,因此可對L [m+1..n]遞迴地查詢第k- m小的元素
③ 當m>k時,所要尋找的元素一定落在L[1..m-1]中,因此可對L[1..m-1]遞迴地查詢第k小的元素
3. 已知由n(n≥2)個正整數構成的集合A={a}0≤k<n},將其劃分為兩個不相交的子集A[和A2,元素個數分別是n;和M2,A1和A2中的元素之和分別為S和S2。設計一個儘可能高效的劃分演算法,滿足|n1- n2|最小且|S1- S2|最大
分析:
① |n1- n2|最小:分的均勻
② |S1- S2|最大:大小分離
演算法思想:
由題意知,將最小的Ln/2個元素放在A中,其餘的元素放在A2中,分組結果即可滿足題目
要求。仿照快速排序的思想,基於樞軸將n個整數劃分為兩個子集。根據劃分後樞軸所處的位置i分別處理:
① 若i=向下取整(Ln/2),則分組完成,演算法結束
② 若i<向下取整(Ln/2), 則樞軸及之前的所有元素均屬於A1,繼續對i之後的元素進行劃分
③ 若i>向下取整(Ln/2),則樞軸及之後的所有元素均屬於A2,繼續對i之前的元素進行劃分
4. 有一種簡單的排序演算法,稱為計數排序( count sorting).這種排序演算法對一個待排序的表(用陣列表示)進行排序,並將排序結果存放到另一個新的表中。必須注意的是,表中所有待排序的關鍵碼互不相同,計數排序演算法針對表中的每個記錄,掃描待排序的表一趟,統計表中有多少個記錄的關鍵碼比該記錄的關鍵碼小,假設針對某個記錄統計出的計數值為C,則這個記錄在新有序表中的合適存放位置即為C。與簡單選擇排序相比較,這種方法是否更好?為什麼?
簡單選擇排序演算法比本演算法好。簡單選擇排序的比較次數是n(n-1)/2,且只用一個交換
記錄的空間;而這種方法的比較次數是n^2,且需要另一陣列空
5. 設有一個數組中存放了一個無序的關鍵序列K1, K2,...Kn。現要求將Kn放在將元素排序後的正確位置上,試編寫實現該功能的演算法,要求比較關鍵字的次數不超過n
6.