細講排序演算法之選擇排序

2021-08-16 12:08:00 字數 2435 閱讀 3271

內部排序:

全部資料可同時放入記憶體進行的排序。    

外部排序:

檔案中資料太多,無法全部調入記憶體進行的排序。

定義:設有記錄序列:

其相應的關鍵字序列為:;

若存在一種確定的關係:kx

<= k

y<=

…<=kz

則將記錄序列  

排成按關鍵字有序的序列 

的操作,稱之為排序。

關係是任意的,通常使用小於(

遞增)、大於(

遞減)等關係。

穩定與不穩定:

若記錄序列中的任意兩個記錄rx

、ry的關鍵字 kx

= ky  

;如果在排序之前和排序之後,它們的相對位置保持不變,則這種排序方法是穩定的,否則是不穩定的。

選擇排序的基本思想:每一趟在

n-i+1(i

=1,2,3,…,n-1)

個記錄中選取關鍵字最小的記錄作為有序序列中第

i個記錄。

一輪下來,找到最小的關鍵字的位置,與第i個記錄交換。最後乙個元素無需比較。從這裡可以看出,該演算法是不穩定的。

4862     35     77    55    

1435    98

14   

14     35    

14     35     35   

14     35      35     48   

14    35     35     48      55     

14    35     35      48     55      62    

14    35    35      48      55      62      77      98

void selectsort(int *r,int length)

/*對記錄陣列r做簡單選擇排序,length為陣列的長度*/

最大化堆

最小化堆

堆可以利用一維陣列儲存

1)調整堆

演算法思想:

a.首先將於堆相應的完全二叉樹根結點中的記錄移出,該記錄稱為待調整記錄。此時根結點相當於空結點,從空結點的左右孩子中選出乙個關鍵字較大的記錄,如果該記錄的關鍵字大於待調整記錄的關鍵字,則將該記錄上移至空結點中。

b.此時,原來那個關鍵字較大的子結點相當於空結點,從空結點的左右孩子中選出乙個關鍵字較大的記錄,如果該記錄的關鍵字仍大於待調整記錄的關鍵字,則將該記錄上移至空結點中。

c.重複上述移動過程,直到空結點左右孩子的關鍵字均小於待調整記錄的關鍵字。此時,將待調整記錄放入空結點即可。

例:

2)建立初始堆:從標號最大的有孩子的點

i開始篩選,(i=n

整除2),然後i減

1,直到

i為1為止。

效能分析:

堆排序在最壞情況下,其時間複雜度為

o(nlog2n

)。不穩定排序,不適用於待排序記錄個數

n較少的情況。

//建初堆

void createheap(int *r,int n)

void adjust(int *r,int k,int n)  //調整下標為k的結點

}r[i] = x;

}

//堆排

void heapsort(int *r,int n)

}

演算法 排序演算法第二講 選擇排序

前面我們已經介紹過排序演算法的歸類以及插入排序 鏈結戳這裡 選擇排序分為選擇排序和堆排序。選擇排序的思想是先讓最大數和最小數都為陣列第乙個數,遍歷陣列記錄每一趟最大或最小數與第乙個數進行比較。void selectsort int a,size t n swap a min a left if ma...

排序演算法 排序演算法之選擇排序

最近在學習排序演算法,就排序演算法中的四大經典排序 氣泡排序 快速排序 選擇排序 插入排序。會出一系列的講解排序演算法的部落格。今天繼快速排序之後整理一下選擇排序。選擇排序,就是從一列未排序的陣列中先選出最小 最大 的數,放在陣列的第一位,第一位原來的數字放在最小的原來的位置,再選出第二小的數,放在...

排序演算法之選擇排序 選擇排序 堆排序

直接選擇排序 如下 下面 是一次迴圈同時挑選出最大和最小數,並將其與左右交換 選擇排序 void selectionsort int a,int len swap a min a left 如果最大數的下標在為left,證明要交換的最大數已經被 換到min小標所表示的位置,只需要將right和min...