選擇排序和堆排序

2021-08-05 18:30:11 字數 1072 閱讀 7506

選擇排序的思想很簡單,就是在陣列找到乙個最大的然後放到最後面(公升序)、最前面(降序),或者找乙個最小的放到最前面(公升序)最後面(降序)。此外還有優化方案就是從兩邊開始,同時找最大的和最小的,找的後放到正確的位置

void selectsort1(vector

& v)

int i = 0;

int j = 0;

for (i = 0; i1; i++)//控制交換的次數

}}void selectsort2(vector

& v)

int left = 0;

int right = v.size() - 1;

while (left < right)

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

}swap(v[left], v[min]);

if (max == left)//這裡的判斷是為了避免最大的在left這個位置,而一交換,最大的數字置就會改變。

swap(v[right], v[max]);

left++;

right--;

}}選擇排序是一種不穩定的排序(4,4,3第乙個4就會移到第二個4後面),時間複雜度為o(n^2)

大堆:每個父子節點都大於孩子節點

小堆:每個父子節點都小於孩子節點

堆排序也是選擇排序的一種。如果公升序就建大堆,每次取堆頂的數往最後放(swap(heap[0],heap[end])),交換往後該堆就不是乙個大堆了(除最後乙個放好的數),從開始位置進行一次向下調整,又將其調整為乙個大堆,把堆頂與最後次位置進行交換,依次這樣進行排序。如果降序建小堆

class solution 

if(a[parent]2+1;

}else}}

void sortintegers2(vector& a)

int end=a.size()-1;

while(end>0)

}*/};

此外我們也可以這樣實現堆排序

void sortintegers2(vector& v)

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

選擇排序 從序列中依次選出最小值 或者最大值 放在一側。這樣的排序叫選擇排序。這裡我們對選擇排序進行優化,一次就選出當前序列的最大值和最小值。分別放在最右端和最左端。然後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...