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

2021-08-16 01:57:46 字數 1539 閱讀 9441

選擇排序:

基本思想:每一趟(第i趟,i=0,1,…,n-2)在後面n-i個待排序的資料元素集合中選出關鍵碼最小的資料元素,作為有序元素序列的第i個元素。待到第n-2趟做完,待排序元素集合中只剩下1 個元素,排序結束。

一、選擇排序

每一次在一組數中選最大的放到最後,然後再在剩餘的數中選次大的數放到倒數第二個位置,直到這組數選完為止;(以公升序為例)

void selectsort(int *array, size_t size)

if (maxpos != size - i - 1)

swap(array[maxpos], array[size - i - 1]);

}}

時間複雜度o(n^2)

穩定性:不穩定

優化:上面

的簡單選擇排序,每趟迴圈只能確定乙個元素排序後的定位。我們可以改進為每趟迴圈確定兩個元素(當前趟最大和最小記錄)的位置,從而減少排序所需的迴圈次數。

若 改進後,對n個資料進行排序,最多隻需進行[n/2]趟迴圈即可。

1、首先標記最大和最小的位置的下標

2、判斷最左位置下標的數和最小值下標的數比較,如果大則兩者相交換,否則向後移動;

判斷最右位置下標的數和最大值下標的數比較,如果小則交換.

**如下:

void selectsortop(int *array, size_t size)

if (maxpos!=end)

swap(array[maxpos], array[end]);

if (minpos == end)

minpos = maxpos;

if (minpos != begin)

swap(array[minpos], array[begin]);

++begin;

--end;

}}

二、堆排序

我們知道堆其實就是一顆完全二叉樹或者我們可以看成是近似完全二叉樹,

1、父節點的值大於或者等於任何乙個子節點的值

2、左右子樹都是堆

堆排序就是一種選擇排序,我們以大堆為例,我們把堆頂與最後的位置交換,然後其餘的元素繼續調整建堆,再把堆頂的元素和倒數第二個位置的元素進行交換,直到所有的數有序。

1、建立堆---公升序:大堆    

降序:小堆

2、堆排序

用堆頂元素和最後乙個元素交換

調整堆---

找左右孩子中最大的child,

檢測child是否比parent大-->child>parent--交換--繼續調整       child

**如下:

//堆排

void adjustdown(int *array, size_t size, size_t parent)

else

break; }}

void heapsort(int *array, size_t size)

}

選擇排序(選擇排序和堆排序)

選擇排序 從序列中依次選出最小值 或者最大值 放在一側。這樣的排序叫選擇排序。這裡我們對選擇排序進行優化,一次就選出當前序列的最大值和最小值。分別放在最右端和最左端。然後left right 使得序列範圍縮小,再進行選擇最大和最小值。void selectsort int a,int n 3選擇排序...

選擇排序 (選擇排序和堆排序)

原理 每一次從無序區間選出最大 或最小 的乙個元素,存放在無序區間的最後 或最前 直到全部待排序的資料元素排完 穩定性 不穩定 1.乙個穩定的排序可以變成不穩定的排序 2.乙個本身就不穩定的是不可能變成穩定的 空間複雜度 o 1 時間複雜度 o o n 2 public static void se...

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

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