這次學習的總結為–選擇排序包括簡單選擇排序和堆排序。總結兩種排序的基本構造思路,並比較排序時間
選擇排序的基本思想是:每次從待排序的資料元素集合中選取關鍵字最小(或最大)的資料元素,放到資料元素集合的最前(或最後),資料元素集合不斷縮小,當資料元素集合為空時選擇排序結束。
1.基本思想
第一次從陣列a[0…n-1]中選取最小值,與a[0]交換
第二次從a[1…n-1]中選取最小值,與a[1]交換
第i次從a[i-1…n-1]中選取最小值,與a[i-1]交換
總共進行n-1趟排序
2.移動次數
最好情況下,陣列和排序演算法的順序一致,則物件的移動次數為 0
最壞情況是每一趟都要進行交換,總的物件移動次數為3(n-1)。
3.演算法分析
時間效率:o(n^2)
設整個待排序物件序列有n 個物件, 則第i 趟選擇具有最小排序碼物件所需的比較次數總是n-i-1次。總的排序碼比較次數為n(n-1)/2
空間效率:o(1)——僅用到1個temp
演算法的穩定性:不穩定
#include
"stdio.h"
#include
#include
#define randnum 10000
//隨機數的個數
typedef
struct
elemtype;
void
selectsort
(elemtype a,
int n)
}}
利用首趟的n-1次比較的資訊,從而儘量減少後續比較次數
1.堆的定義:
設有n個資料元素的序列 k0,k1,…,kn-1,當且僅當滿足下述關係之一時,稱之為堆。
解釋:如果讓滿足以上條件的元素序列 (k0,k1,…,kn-1)順次排成一棵完全二叉樹。
則此樹的特點是:樹中所有結點的值均大於(或小於)其左右孩子,此樹的根結點(即堆頂)必最大(或最小)。
2.建堆
步驟:從最後乙個非終端結點開始往前逐步調整,讓每個雙親大於(或小於)子女,直到根結點為止。
終端結點(即葉子)沒有任何子女,無需單獨調整
3.進行整個序列的堆排序
難點:將堆的當前頂點輸出後,如何將剩餘序列重新調整為堆?
方法:將當前頂點與堆尾記錄交換,然後仿建堆動作重新調整,如此反覆直至排序結束。
4.基於初始堆進行堆排序的演算法步驟
堆的第乙個物件r[0]具有最大的關鍵碼,將r[0]與r[n-1]對調,把具有最大關鍵碼的物件交換到最後;
再對前面的n-1個物件,使用堆的調整演算法,重新建立堆。結果具有次最大關鍵碼的物件又上浮到堆頂,即r[0]位置;
再對調r[0]和r[n-2],然後對前n-2個物件重新調整,…如此反覆,最後得到全部排序好的物件序列。
5.演算法分析
時間效率:o(nlog2 n)因為整個排序過程中需要呼叫n-1次堆頂點的調整,而每次堆排序演算法本身耗時為log2 n;
空間效率:o(1)。僅在交換記錄時用到乙個臨時變數temp。
穩定性: 不穩定。
優點:對小檔案效果不明顯,但對大檔案有效。
void
initcreatheap
(elemtype a,
int n)
;//建初始堆,將陣列a中調整為最大堆
void
creatheap
(elemtype a,
int n,
int h)
;//調整非葉結點a[h]以滿足最大堆定義,n為陣列元素個數
void
heapsort
(elemtype a,
int n)
}void
initcreatheap
(elemtype a,
int n)
void
creatheap
(elemtype a,
int n,
int h)
} a[i]
=temp;
}
主函式如下
void
main()
first=
clock()
;//開始時間
selectsort
(irandnum1,randnum)
;//堆排序
second=
clock()
;//結束時間
printf
(,second-first)
; first=
clock()
;//開始時間
heapsort
(irandnum2,randnum)
;//堆排序
second=
clock()
;//結束時間
printf
(,second-first)
;}
執行結果如下 C語言 選擇排序
選擇排序 selection sort 是一種簡單直觀的 排序演算法 它的工作原理如下。首先在未排序序列中找到最小 大 元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小 大 元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。選擇排序的主要優點與資料移動有關。如果...
c語言選擇排序
選擇排序 第一層迴圈從陣列第乙個元素到倒數第二個元素結束 即比較n 1趟 第二層迴圈元素項比第一層的基礎上增加且小於n 選擇排序是比較後前面固定,如果後面的元素比前面的元素大,就將後面的元素 賦給前面,大迴圈沒迴圈1次,就確定了陣列第乙個元素是最小的 include main for i 0 i 8...
c語言 選擇排序
選擇排序是一種基礎演算法,其方法也很簡單。核心思維就是選擇二字,比如在一組給定10個數字的陣列中。第一次選擇10個數字中最大的數字和最後乙個數字進行交換。第二次選擇前9個數字中最大的數字和倒數第二個數字進行交換。第三次選擇前8個數字中最大的數字和倒數第三個數字進行交換。以此類推,最後完成從小到大的排...