大話數據結構7 - 排序

排序
1、排序:是使得一個序列成爲按關鍵字有序的序列的操作
特點:1.輸入是一個記錄集合,輸出還是這個記錄集合,2.針對不同的關鍵字進行排序,得到不同的序列
關鍵字可以是:主關鍵字、次關鍵字、組合關鍵字(多個關鍵字/若干數據項)
組合排序方法有2種:①先排一個,再排第二個,...,②將若干項的數據先組合作爲一個整體,一次排序
注意:多個關鍵字的排序最終都可以轉化爲單個關鍵字的排序
2、排序算法的穩定性:針對次關鍵字的排序,次關鍵字的排序結果可能會存在不唯一的情況
穩定:排序前ri<rj,排序後ri<rj,就稱該排序算法是穩定的
不穩定:排序前ri<rj,排序後ri>rj,就稱該排序算法是不穩定的
注意:只要有一組關鍵字使用這個排序算法不穩定,該排序算法就是不穩定的
3、內排序、外排序
內排序主要2個操作:關鍵字比較,記錄移動,注意:高效的內排序算法應該有儘可能少的比較次數和移動次數
內排序的性能:①時間性能,②輔助空間,③算法的複雜性
內排序按操作分類:插入,交換,選擇,歸併
4、排序算法分析
算法指標:平均情況、最好情況、最壞情況、輔助空間、穩定性
性能分析可以從幾個方面看:1.時間複雜度,2.空間複雜度,3.穩定性,4.記錄個數,5.移動次數
注意:不同情況應考慮不同的算法來應對

意:這裏講的就是單個關鍵字、線性表的內排序
這裏一共講解7種排序算法
①冒泡排序、②簡單選擇排序、③直接插入排序、④希爾排序、⑤堆排序、⑥歸併排序、⑦快速排序
使用的數據結構是:順序表結構(線性),技巧:r[0]作爲哨兵、臨時變量
經常要用到的函數/操作是:兩元素交換函數
默認:按升序排序,小->大
小技巧:
a.增加一個數組長度閥值,根據記錄個數選擇不同的排序方法
b.使用替換操作代替交換操作
c.使用迭代代替遞歸

1.簡單算法:①、②、③
2.改進算法:④、⑤、⑥、⑦

1.插入排序:③、④
2.交換排序:①、⑦
3.選擇排序:②、⑤
4.歸併排序:⑥

1.穩定的:①、②、③、⑥
2.不穩定的:④、⑤、⑦

1、冒泡排序
概念:相鄰記錄的關鍵字兩兩比較,反序則交換,直到沒有反序的記錄爲止
是一種交換排序
思路最簡單
冒泡排序在實現的細節可以有多種變化
算法:雙重循環:i、j
i:1->length
j:從後向前循環,小值冒出(升);從前向後循環,大值冒出(降)
優化:增加一個標記變量flag,避免因已經有序的情況下的無意義的循環比較
2、簡單選擇排序
概念:通過n-i次比較,從n-i+1個記錄中選出min的記錄,並和第i個記錄交換;即先從後面的記錄中找到min(升)/max(降)值,再交換
是一種選擇排序
算法:雙重循環:i、j
i:1->length
j:從前向後循環,小值被選出(升)
3、直接插入排序
概念:將一個記錄插入到已經排序的有序表中,從而得到一個新的、記錄數增加1的有序表
是一種插入排序
使用到一個臨時變量r[0],需要記錄後移
4、希爾排序
概念:將初始記錄分組,分別進行直接插入排序,當整個序列都基本有序時,再對全體記錄進行一次直接插入排序
是一種插入排序,是對直接插入排序算法的改進
基本有序:小的關鍵字基本在前面,大的關鍵字基本在後面,不大不小的基本在中間(升)
分組:採用跳躍分割的策略,將相距某個“增量”的記錄組成一個子序列,保證分組排序後的結果是基本有序,不是局部有序
增量的選取非常關鍵,注意:目前還沒有總結出一種最好的增量序列
注意:增量序列的最後一個增量必須爲1,增量=1即使對整個序列進行直接插入排序
不穩定:由於記錄是跳躍式的移動,所以希爾排序算法是不穩定的
5、堆排序,heap sort
概念:將待排序的序列(順序表)構造成一個大頂堆(升),成爲滿足關係①的順序表,整個序列中的最大值就是堆的根結點,將根結點移動交換到堆數組末尾,將剩餘的n-1個序列重新構造一個堆,可得序列中次大值,重複以上過程,反覆執行,便得到了一個有序表
是一種選擇排序,是對簡單選擇排序的一種改進,利用堆結構進行排序的方法
堆:是一種完全二叉樹,大頂堆、小頂堆:每個結點的值大於等於(大頂堆)/小於等於(小頂堆)左右孩子結點的值
注意:根結點一定是堆中所有結點最大/小者
按層序遍歷的方式給堆結構結點從1開始編號,結點之間滿足關係①(略)
將堆結構(大頂堆、小頂堆)用層序遍歷存入數組,成爲滿足關係①的順序表
算法:
堆/堆結點調整函數:對指定非終端結點(非葉子結點)進行的調整
主函數:兩個for循環
1.第一個是將n個元素的初始序列構建成一個大頂堆(對所有非終端結點進行的從下往上、從右到左的調整),比較多、移動多
2.第二個是交換根結點與末尾結點,再構造大頂堆(對根結點進行的調整),比較少、移動少
注意:二叉樹性質5,完全二叉樹的雙親結點序號爲s,則它的左孩子序號一定是2s、右孩子序號一定是2s+1
不適合:由於初始構建堆所需的比較次數比較多,之後再調整堆比較次數就很少,所以堆排序不適合序列個數較少的情況
不穩定:由於記錄的比較與交換是跳躍式進行,所以堆排序算法是不穩定的
6、歸併排序
概念:2路歸併排序,設初始序列有n個記錄,可以看做是n個長度爲1的有序子序列,兩兩歸併,得到n/2個長度爲2或1的有序子序列,再兩兩歸併,如此重複,直到得到長度爲n的有序序列爲止
是一種歸併排序,利用完全二叉樹結構進行排序的方法
歸併:在數據結構中的定義是,將兩個或兩個以上的有序表組合成爲一個新的有序表
算法:2種
1.遞歸調用
主函數、拆分序列函數/遞歸函數、合併函數
2.非遞歸調用,迭代(推薦)
主函數、中間函數、合併函數
優缺點:佔空間,但效率高且穩定
7、快速排序
概念:通過一趟排序將待排序記錄分割成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分記錄的關鍵字小,則分別對這兩部分記錄繼續進行排序,直到整個序列有序爲止
是一種交換排序,是冒泡排序的升級
樞軸(pivot):對於一個關鍵字,左邊的值都比它小,右邊的值都比它大,這個關鍵字就稱爲樞軸
小數集合、樞軸、大數集合(升)
首樞軸的選取方法(重要):①固定選取,②隨機選取,③三數取中(記錄的個數較少),④九數取中(記錄的個數較多,推薦)
注意:快速排序算法的快慢取決於首樞軸處於整個序列的位置,潛在的性能瓶頸
算法:
採用遞歸調用,首樞軸的值等於中間大小,遞歸樹是平衡的,性能最優;首樞軸的值等於最大或最小,遞歸樹是斜樹,性能最差
① 基本算法:遞歸調用,固定選取
主函數、遞歸函數、樞軸函數
②優化算法:遞歸調用,三數取中、九數取中
在樞軸函數中添加首樞軸的選取即可
優缺點:佔空間、不穩定、對少量數據排序無優勢,但因爲增大了記錄的比較和移動的距離,所以減少了總的比較次數和移動交換次數
不穩定:關鍵字的比較與交換是跳躍式進行,所以快速排序算法是不穩定的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章