選擇排序的基本思想:每一趟(例如第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 ...