所有的排序都以升序爲例。考慮複雜度,考慮穩定性的情況。以及在原基礎上步步優化。
在上篇排序(1)的博客裏有提到過穩定性的問題。但是沒有做出解釋。在這邊解釋一下穩定性的問題。
排序前:5,1,3a,,4,7,3b
穩定的排序:1,3a,3b,4,5,7
不穩定的排序:1,3b,3a,4,5,7
在自定義的對象進行排序的時,穩定性會影響最終的排序效果。
加粗樣式
選擇排序:
算法:
**1.在序列中找出最大的那個元素,然後與末尾的元素進行交換。(執行完一輪後,最末尾的那個元素就是最大元素);
**2.忽略1中曾經找到的那個最大元素,重複執行步驟1.
選擇排序:
void SelectSort::sort(int array[], int len)
{
if (array == NULL || len == 1)
{
return;
}
this->m_array = array;
this->m_len = len;
for (int end = this->m_len - 1; end > 0; end--)
{
//每次假設數組的首元素爲數組序列的最大值
int maxIndex = 0;
for (int begin = 1; begin <= end; begin++)
{
//如果序列中有maxIndex大的元素,maxIndex變化
if(this->cmp(maxIndex,begin) <= 0)
{
maxIndex = begin;
}
}
//最大的元素與數組最後一個元素交換,end隨之在for裏面--
this->swap(maxIndex, end);
}
for (int i = 0; i < this->m_len; i++)
{
cout << this->m_array[i] << "_";
}
}
選擇排序的優化:
其實堆排序就是對選擇排序的優化,在後面的博客中會詳細介紹堆排序。