排序 選擇排序

2021-08-04 16:16:22 字數 1465 閱讀 7444

每一趟從無序區中選出最小的元素,順序放在有序區的最後,直到全部元素排序完畢。

由於選擇排序每一趟總是從無序區中選出全域性最小(或最大)的元素,所以適用於從大量元速度中選擇一部分排序元素。例如,從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.演算法分析

由於要選出最小值,故無序區中的每個元素都要參與比較,所以無論初始資料序列的狀態如何,總的比較次數為:

故直接選擇排序的時間複雜度為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;

}}void heapsort(int

*arr, int

size)

//2.將arr[0]與arr[n-1]交換,然後再調整arr[0...n-1],使其滿足大堆,如此反覆操作

for (root = size-1; root >= 1; root--)

}

3.演算法分析

堆排序的時間主要由建堆和反覆調整堆這兩部分的時間構成,由於可以把堆看成完全二叉樹的結構,所以堆排序的時間複雜度為o(n*lgn),空間複雜度為o(1),堆排序演算法不穩定。

排序 選擇排序 選擇排序 堆排序

寫在前面 上傳github交換排序選擇排序 堆排序 選擇排序 顧名思義,我們就可以猜到,它是原則合適的元素放到合適的位置 從圖中,我們可以得到 1.用第乙個元素,和其他所有的元素進行比較,找出最小的,然後進行交換 2.然後進行,資料的遞增 3.直到資料全部有序 void selectsort int...

排序 選擇排序(直接選擇排序 堆排序)

選擇排序 selection sort 的基本思想是 每一趟從待排序的記錄中選出關鍵字最小的記錄,順序放在已排好序的子檔案的最後,直到全部記錄排序完畢。常用的選擇排序方法有 直接選擇排序 和堆排序。直接選擇排序 straight selection sort 1 直接選擇排序的基本思想 n個記錄的檔...

排序2 選擇排序 選擇排序 堆排序

選擇排序,依次找到資料集n n 1 n 2 中比它大 小的最大 最小者,最終達到全部資料有序。1 選擇排序 直接的依次找到資料集合n n 1 n 2.的最大 最小者形成排序,非常好理解。選擇排序可能是和氣泡排序一樣,最直觀能想到的排序方法。顯然選擇排序和氣泡排序一樣,無所謂最好 最壞 平均,選擇排序...