1 選擇排序的基本思想
每一次從待排序的資料元素中選出最小(或最大)的乙個元素,存放在序列的起始位置(或末尾),直到全部待排序的資料元素排完。選擇排序可分為直接選擇排序、堆排序。
2 直接選擇排序
2.1 演算法步驟
1.在元素集合array[i]–array[n-1]中選擇關鍵碼最大(小)的資料元素
2.若它不是這組元素中的最後乙個(第乙個)元素,則將它與這組元素中的最後乙個(第乙個)元素交換
3.在剩餘的array[i]–array[n-2](array[i+1]–array[n-1])集合中,重複上述步驟,直到集合剩餘1個元素
2.2 **實現
void
swap
(int
* left,
int* right)
void
selectsort
(int array,
int size)
if(maxpos != size - i -1)
}}
以上**僅標記maxpos位置,效率較低。可一起標記maxpos和minpos兩個位置,同時尋找,效率增大一倍,**如下:
void
swap
(int
* left,
int* right)
void
selectsortop
(int array,
int size)
//最大元素放最後
if(maxpos != end)
swap
(&array[maxpos]
,&array[end]);
//如果end位置儲存的剛好是最小元素,上面的交換就將最小元素位置更改了
//最小元素位置發生了改變,則必須更新minpos
if(minpos == end)
minpos = maxpos;
//最小元素放最前
if(minpos != begin)
swap
(&array[minpos]
,&array[begin]);
++begin;
--end;
}}
2.3 特性
直接選擇排序思考非常好理解,但是效率不是很好。實際中很少使用
時間複雜度:o(n^2)
空間複雜度:o(1)
穩定性:不穩定
3 堆排序
3.1 基本思想
堆排序(heapsort)是指利用堆積樹(堆)這種資料結構所設計的一種排序演算法,它是選擇排序的一種。它是通過堆來進行選擇資料。需要注意的是排公升序要建大堆,排降序建小堆。
3.2 演算法步驟
1.建堆(利用向下調整的思想,具體大堆還是小堆看公升序還是降序)
2.排序(利用堆刪除的思想進行排序)
3.3 **實現
void
swap
(int
* left,
int* right)
//向下調整
void
heapadjust
(int array,
int size,
int parent)
else}}
void
heapsort
(int array,
int size)
}
3.4 特性
堆排序使用堆來選數,效率就高了很多。
時間複雜度:o(n*logn)
空間複雜度:o(1)
穩定性:不穩定
資料結構 直接選擇排序和堆排序
每一次從待排序的資料元素中選出最小 最大 的乙個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。選擇排序 每一次從未排序的資料中找到乙個最小的,把最小的放到未排序的資料的頭部,不斷重複 void swap int arr,int pos1,int pos2 void selectsort ...
選擇排序(直接選擇 堆排序)
直接選擇排序 不穩定 排序過程 1 首先在所有資料中經過n 1次比較選出最小的數,把它與第1個資料交換,2 然後在其餘的資料內選出排序碼最小的數,與第2個資料交換.依次類推,直到所有資料排完為止。在第i 趟排序中選出最小關鍵字的資料,需要做n i次比較。複雜度 總的比較次數為 n n 1 2 o n...
選擇排序 直接選擇排序,堆排序
選擇排序 selection sort 是一種簡單直觀的 排序演算法 它的工作原理是每一次從待排序的 資料元素 中選出最小 或最大 的乙個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。選擇排序是不穩定的排序方法 1.簡單的選擇排序 基本思想 在要排序的一組數中,選出最小的乙個數與第乙個位...