選擇排序(簡單選擇排序和堆排序)

2021-10-06 09:52:51 字數 2284 閱讀 2243

選擇排序的基本思想:每一趟(例如第i趟)在後面n-i+1(i=1,2,…n-1)個待排序元素中選取關鍵字最小的元素,作為有序子串行的第i個元素,直到第n-1趟做完,待排序元素只剩下了1個,就不用再選了。

1.簡單選擇排序

簡單排序演算法思想:假設排序表為l[1…n],第i趟排序即從l[i…n]中選擇關鍵字最小的元素與l(i)交換,每一趟排序可以確定乙個元素的最終位置,這樣經過n-1趟排序就可以使得整個排序表有序。**如下:

#include

#include

using

namespace std;

void

swap

(int

*a,int

*b);

void

selectsort

(int a,

int n)

;int

main()

selectsort

(a, n)

;printf

("請輸出排序好的陣列:\n");

printf

("請輸出排序好的陣列:\n");

for(

int i=

0; i

)return0;

}void

swap

(int

*a,int

*b)selectsort

(int a,

int n)

}}

編譯執行結果如下:

2.堆排序

堆排序思路:首先將存放在l[1…n]中的n個元素建成初始堆,由於堆本身的特點,堆頂元素就是最大值,輸出堆頂元素後,通常將堆底元素送入堆頂,此時根結點已不滿足大根堆的性質,堆被破壞,將堆頂元素向下調整使其繼續保持大根堆的性質,再輸出堆頂元素,如此反覆,直到堆中僅剩下乙個元素為止。

堆排序是一種樹形選擇排序方法,特點:在排序過程中,將l[1…n]看成是一棵完全二叉樹的順序結構,利用完全二叉樹中雙親結點和孩子節點之間的內在關係,在當前無序區中選擇關鍵字最大(或最小)的元素。

堆的定義如下:n個關鍵字序列l[1…n]稱為堆,當且僅當該序列滿足:

1.l(i)>=l(2i) 且 l(i)>=l(2i+1) 【大根堆】 2.l(i)<=l(2i) 且 l(i)<=l(2i+1) 【小根堆】

堆排序的關鍵是構造初始堆,對初始序列建堆,就是乙個反覆篩選的過程。n個結點的完全二叉樹,最後乙個結點是第[n/2]個結點的孩子。對第[n/2]個結點為根的子樹篩選(對於大根堆:若根結點的關鍵字小於左右子女中關鍵字較大者,則交換),使該子樹成為堆。之後向前依次對各節點([n/2]-1 ~1)為根的子樹進行篩選,看該結點值是否大於其左右子樹結點的值,若不是,將左右子結點中較大值與之交換,交換後可能會破壞下一級的堆,於是繼續採用上述方法構造下一級的堆,直到以該結點為根的子樹構造成堆為止。反覆利用上述調整堆的方法建堆,直到根結點。

**如下:

#include

#include

using

namespace std;

void

heapsort

(int a,

int len)

;void

buildmaxheap

(int a,

int len )

;void

adjustdown

(int a,

int k,

int len )

;int

main()

heapsort

(a, n)

;printf

("請輸出排序好的陣列:\n");

for(

int i=

1; i<=n; i++

)return0;

}void

buildmaxheap

(int a,

int len)

}void

adjustdown

(int a,

int k,

int len)

if(a[i]

)break

;else

} a[k]

= a[0]

;//被篩選節點最終位置

}void

heapsort

(int a,

int len)

}

選擇排序 簡單選擇排序和堆排序

1.簡單選擇排序 1 演算法思想 將序列的第乙個元素當作最小的元素,和後面的元素一一比較,將最小的元素下標標記出來,和第乙個元素進行交換,則一趟下來,第乙個元素一定是最小的,直到所有的元素全部排序完成。2 基本實現 void selectsort datatype arr,int sz if k i...

選擇排序 簡單選擇排序和堆排序

這裡的測試資料來自於之前自己隨便寫的生成器 include using namespace std intmain int t 10,arr 20 while t return0 簡單選擇排序 void selectsort int arr,int n if min i 簡單選擇排序 空間複雜度 使...

選擇排序 簡單選擇排序 堆排序

一 簡單選擇排序 對於n個數要進行n次排序,第一次,將最小的數放在第乙個。第二次,將第二小的樹,放在第二個。每次都和後面的數做比較,如果是從小到大的排序,當當前的數字比後面的大時,要進行交換。include void chosesort int a,int length void main int ...