基本思想
每一趟從無序區中選出最小的元素,順序放在有序區的最後,直到全部元素排序完畢。
由於選擇排序每一趟總是從無序區中選出全域性最小(或最大)的元素,所以適用於從大量元速度中選擇一部分排序元素。例如,從10000個元素中選出最小的前10位元素。
直接選擇排序
1.排序思路
從第i趟開始,從當前無序區arr[i…n-1]中選出最小元素arr[k],將它與有序區的最後乙個元素,也就是無序區的第乙個元素交換。每趟排序後,有序區增加乙個元素,無序區減少乙個元素,且有序區中所有元素均小於等於無序區中的元素。經過n-1趟排序後,無序區只剩下arr[n-1]乙個元素,它必然為整個序列的最大值,故無需再排。
2.排序演算法
void selectsort(int *arr, int size)
}//2.把最小的元素與無序區第乙個元素交換
//swap(arr[i], arr[k]);
if (k != i)
}}3.演算法分析
由於要選出最小值,故無序區中的每個元素都要參與比較,所以無論初始資料序列的狀態如何,總的比較次數為:
c = n-1 +n-2+n-3+…+2+1 = n(n-1)/2
故直接選擇排序的時間複雜度為o(n^2),空間複雜度為o(1)。直接選擇排序是乙個不穩定的演算法。例如,排序序列為,第一趟排序後得到,兩個5的相對位置發生了變化。
4.優化版本
每趟排序同時找出最大值和最小值,把最小值放在序列的左邊,最大值放在序列的右邊,然後同時縮小左右排序範圍。
//優化,每趟排序同時找出最大值和最程式設計客棧小值
void selectsort1(int *arr, int size)
left++;
right--;
}}堆排序
1.排序思路
堆排序是一種樹形選擇排序方法,在排序過程中,將arr[0…n-1]看成一棵完全二叉樹的順序儲存結構,利用完全二叉樹中雙親節點和孩子結點之間的內在關係,在當前無序區中選擇最大(或最小)的元素。
下標從0開始,節點i的兩個孩子節點可表示為2*i+1、2*i+2。
2.排序演算法
void adjustdown(int *arr, int size, int parent)
if (arr[parent] < arr[child])
else
break;www.cppcns.com
}}void heapsort(int *arr, int size)
//2.將qrotoarr[0]與arr[n-1]交換,然後再調整arr[0...n-1],使其滿足大堆,如此反覆操作
for (root = size-1; root >= 1; root--)
}3.演算法分析
堆排序的時間主要由建堆和反覆調整堆這兩部分的時間構成,由於可以把堆看成完全二叉樹的結構,所以堆排序的時間複雜度為o(n*lgn),空間複雜度為o(1),堆排序演算法不穩定。
本文標題: c++選擇排序演算法例項詳解
本文位址:
演算法 選擇排序,例項分析選擇排序演算法
選擇排序,將乙個序列看做兩個部分,前面有序,後面無序,每次在後面的無序序列中,選擇乙個最小的元素,交換到前面有序序列的末尾,直到無序序列全部完成交換,即可完成排序 選擇排序是不穩定的排序演算法 有乙個序列 5,2,0,1,3,1,4 第一趟排序 第二趟排序 此時我們看到,經過兩趟排序,前面兩個元素 ...
C 堆排序演算法例項詳解
堆中元素的排列方式分為兩種 max heap或min heap,前者每個節點的key都大於等於孩子節點的key,後者每個節點的key都小於等於孩子節點的key。由於堆可以看成乙個完全二叉樹,可以使用連續空間的a來模擬完全二叉樹,簡單原始的實現如下 include int heapsize 0 全域性...
選擇排序演算法(排序詳解)
選擇排序 selection sort 是一種簡單直觀的排序演算法。它的工作原理是每一次從待排序的資料元素中選出最小 或最大 的乙個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。選擇排序是不穩定的排序方法 比如序列 5,5,3 第一次就將第乙個 5 與 3 交換,導致第乙個5挪動到第二個...