選擇排序和堆排序

2021-08-03 07:24:16 字數 898 閱讀 4457

今天val要和大家分享關於選擇排序和堆排序的基本思想和實現**的演算法~以公升序為例

1.選擇排序:在陣列中選出最大(小)的數放在陣列的末(首)端,縮小範圍再進行選擇,這個我在之前的部落格裡有分享過,

當然還有更高效率的選擇排序,每次選出最大的放在陣列尾端,最小的放在陣列首端,這是在乙個迴圈中同時選出來的,這樣一次就有最大和最小被同時選擇出來,效率相對較高。

*要注意迴圈的範圍,最大值最小值的初始值,還有陣列範圍的變化

**如下:

void selectsort(int* a, int n)

if (a[i] < a[min])

}swap(a[max], a[end]);

swap(a[min], a[begin]);

if (max == min)

begin++;

end--;

}}

2.堆排序也是一種選擇排序

利用堆,大堆(父節點大於子節點),小堆(父節點小於子節點),從而快速得到陣列中的最大值(或最小值),公升序建大堆,降序建小堆,堆頂就是最大(最小)的,以公升序為例,把堆頂資料和陣列末尾資料交換,縮小陣列大小,end–,繼續把堆頂資料和它的孩子比較(向下調整),迴圈。

**如下:

void adjustdown(int *a, int n, int i)//n個數  從i開始調節

if (a[child]>a[root])

else

}}void heapsort(int* a, size_t n)

int end = n - 1;//要進行堆排序的最後乙個元素下標

for (; end > 0; end--)

//while(end>0)

//}

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

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

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

選擇排序 基本思想 每一趟 第i趟,i 0,1,n 2 在後面n i個待排序的資料元素集合中選出關鍵碼最小的資料元素,作為有序元素序列的第i個元素。待到第n 2趟做完,待排序元素集合中只剩下1 個元素,排序結束。一 選擇排序 每一次在一組數中選最大的放到最後,然後再在剩餘的數中選次大的數放到倒數第二...

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

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