選擇排序主要是每一趟從待排序列中選取乙個關鍵碼最小的記錄,也即第1趟從n個記錄中選取關鍵碼最小的記錄,第2趟從剩下的n-1個記錄中選取關鍵碼最小的記錄知道整個序列的記錄選完。這樣,由選取記錄的順序便得到按關鍵碼有序的序列。
1、簡單選擇排序
簡單選擇排序的過程為:第1趟,從n個記錄中找出關鍵碼最小的記錄與第1個記錄交換;第2趟,從第2個記錄開始的n-1個記錄中再選出關鍵碼最小的記錄與第2個記錄交換;如此類推,第i趟,則從第i個記錄開始的n-i+1個記錄中選出關鍵碼最小的記錄與第i個記錄交換知道整個序列按關鍵碼有序。其具體過程如下圖示:有排序表「25 36 30 36 10 56 12」
具體演算法如下:
2、樹結構選擇排序
樹結構選擇排序是按照錦標賽的思想進行的,首先將n個參賽的選手通過n/2次兩兩比較,再從n/2個勝者中進行兩兩比較,如此重複知道選擇除勝者(如最大)。這個過程可用乙個具有n個葉子結點的完全二叉樹來表示,則該完全二叉樹有2n-2或2n-1個結點。接下來,將第一名的結點看成成績最差的,並從該結點(葉子位置)開始沿該結點到跟路徑上一次進行各分支結點子女間的比較,勝出的就是第二名。因為與其比賽的均是剛剛輸給第一名的選手。如此,繼續進行下去,知道所有選手的名次排定。下面示例說明:
16個選手比賽,如下圖所示,該方法占用空間較多,除需輸出排序結果的n個單元外,尚需n-1個輔助單元。
產生第一名的過程:
產生第二名的過程:
具體演算法如下:
以上演算法還可以試著優化。
3、堆排序
簡單選擇排序的思想簡單易於實現,但其時間效能沒有優勢。因為在每趟選擇中並沒有把前面選擇過程中的一些有用資訊繼承下來,因此每趟選擇都是順序地一一進行。如果能改善這一點則定會減少比較次數提供排序效率——堆排序演算法就實現了這點。
此處堆的定義為:設有n個元素的序列,當且僅當滿足下述關係之一時,稱之為堆。
,其中,前者稱為小頂堆,後者稱為大頂堆。
例如,序列12 36 24 85 47 30 53 91是乙個小頂堆;序列91, 47 85 24 36 53 30 16是乙個大頂堆。
乙個有n個元素的序列是否是堆,可以和一棵完全二叉樹對應起來,i和2i、2i+1的關係就是舒安琪逾期左、右孩子之間的位置關係(i=1, 2, ……,n/2)。因此,通常用完全二叉樹的形式來直觀地描述乙個堆。以下兩圖分別對應上例用的小頂堆和大頂堆:
未完,待續……
排序演算法 排序演算法之選擇排序
最近在學習排序演算法,就排序演算法中的四大經典排序 氣泡排序 快速排序 選擇排序 插入排序。會出一系列的講解排序演算法的部落格。今天繼快速排序之後整理一下選擇排序。選擇排序,就是從一列未排序的陣列中先選出最小 最大 的數,放在陣列的第一位,第一位原來的數字放在最小的原來的位置,再選出第二小的數,放在...
排序演算法之選擇排序
選擇排序 在乙個長度為n的無序陣列中,在第一趟遍歷n個資料,找出其中最小的數值與第乙個元素交換,第二趟遍歷剩下的n 1個資料,找出其中最小的數值與第二個元素交換.第n 1趟遍歷剩下的2個資料,找出其中最小的數值與第n 1個元素交換,至此選擇排序完成。平均時間複雜度 o n2 空間複雜度 o 1 用於...
排序演算法之選擇排序
一 簡單選擇排序 1 基本思想 在要排序的一組數中,選出最小 或者最大 的乙個數與第1個位置的數交換 然後在剩下的數當中再找最小 或者最大 的與第2個位置的數交換,依次類推,直到第n 1個元素 倒數第二個數 和第n個元素 最後乙個數 比較為止。簡單選擇排序的示例 2 操作方法 第一趟,從n 個記錄中...