資料結構 直接選擇排序

2021-08-26 18:15:58 字數 1647 閱讀 9082

直接選擇排序和直接插入排序有點類似,因為在整個排序過程中都將資料分為有序區和無序區,不同的是直接插入排序是將無序區的第乙個元素直接插入到有序區中合適位置以形成乙個更大的有序區,剛開始認為有序區的長度為1,而直接選擇排序是從無序區選乙個最小的元素直接放到有序區的最後,剛開始認為它的有序區長度為0。 

設待排序序列是有n個數的陣列a[n]

初始時,陣列全為無序區為a[0..n-1]。令i=0

在無序區a[i…n-1]中選取乙個最小的元素,將其與a[i]交換。交換之後a[0…i]就形成了乙個有序區

重複第二步直至無序區只剩下乙個元素,即 i = n-1,整個排序完成

以陣列 a[4] = 為排序物件走走直接選擇排序的整個過程

初始時整個陣列為無序區間

無序區間42

613

從無序區間選擇最小的元素與無序區間的第乙個元素交換位置

有序區間

無序區間12

643

繼續從無序區間選擇最小的元素與無序區間的第乙個元素交換位置

有序區間

無序區間12

643

繼續從無序區間選擇最小的元素與無序區間的第乙個元素交換位置

有序區間

無序區間12

34

繼續從無序區間選擇最小的元素與無序區間的第乙個元素交換位置

有序區間

無序區間12

346

此時無序區間只剩下乙個元素,其實根據直接插入排序的思想這時整個陣列已經有序了

有序區間12346

void selectsort(int a,int n)

}}

實現直接插入排序時還有一種風格,在每次遍歷無序區間時找出乙個最小元素換到無序區間最左邊,同時!同時找出乙個最大的元素換到無序區間的最右端,它的整個過程也是很好理解的,這裡不做過多的說明啦直接看**

void selectsort(int* arr, int n)

swap(&(arr[left]),&(arr[min]));

if (left == max) //這段**是這種實現風格最容易忽視掉的,值的認真思考一下

max = min;

swap(&(arr[right]),&(arr[max]));

++left;

--right;

}}

簡單選擇排序的比較與序列的初始序列沒有關係,就算你給我的時候就是乙個有序的序列. 選擇排序還是會老老實實的去迴圈查詢,因為我不遍歷完根本就不知道我到底是不是最小的. 假設待排序列有n個元素,則比較次數總是n(n-1)/2. 所以時間複雜度無論無何都是o(n^2).

最壞時間複雜度

平均時間複雜度

最好時間複雜度

空間複雜度

由於選擇元素之後會發生交換操作,所以有可能把前面的元素交換到後面,所以不是穩定的排序 

例如:

資料結構 直接選擇排序

直接選擇排序 straight select sorting 也是一種簡單的排序方法,它的基本思想是 第一次從r 0 r n 1 中選取最小值,與r 0 交換,第二次從r 1 r n 1 中選取最小值,與r 1 交換,第i次從r i 1 r n 1 中選取最小值,與r i 1 交換,第n 1次從r ...

資料結構 選擇排序(直接選擇 堆排序)

1 選擇排序的基本思想 每一次從待排序的資料元素中選出最小 或最大 的乙個元素,存放在序列的起始位置 或末尾 直到全部待排序的資料元素排完。選擇排序可分為直接選擇排序 堆排序。2 直接選擇排序 2.1 演算法步驟 1.在元素集合array i array n 1 中選擇關鍵碼最大 小 的資料元素 2...

資料結構 排序 選擇排序 直接選擇排序法

直接選擇排序 straight selection sort 直接選擇排序的基本思想 n個記錄的檔案的直接選擇排序可經過n 1趟直接選擇排序得到有序結果 初始狀態 無序區為r 1.n 有序區為空。第1趟排序 在無序區r 1.n 中選出關鍵字最小的記錄r k 將它與無序區的第1個記錄r 1 交換,使r...