資料結構 C語言 選擇排序

2021-10-02 01:27:28 字數 2952 閱讀 4162

這次學習的總結為–選擇排序包括簡單選擇排序堆排序。總結兩種排序的基本構造思路,並比較排序時間

選擇排序的基本思想是:每次從待排序的資料元素集合中選取關鍵字最小(或最大)的資料元素,放到資料元素集合的最前(或最後),資料元素集合不斷縮小,當資料元素集合為空時選擇排序結束。

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個數字中最大的數字和倒數第三個數字進行交換。以此類推,最後完成從小到大的排...