在前面介紹完vector向量類的實現後,在此處簡要介紹三個排序演算法的實現,其中包括**以及圖示例。
1>下面首先介紹選擇排序。選擇排序是選定首端或者末端作為遍歷開端,此處假定選定末端。在一次從後往前遍歷的過程中,在指標指向元素的前方,選出其中最大的乙個值,與指標指向的元素交換。每一次交換都保證最大值排在此指標上次元素的後面。具體**如下所示。
template void vector::selectsort(rank lo, rank hi) //選擇排序
}templaterank vector::max(rank lo, rank hi) //選出範圍最大值
return mx; //返回最大值的秩,即下標
}
只看**沒有感性的認識,下面附上一張選擇排序的示例圖。
主要步驟是選出指標指向元素前方的最大值與指標指向元素交換,在經過一輪的遍歷以後,這個區間的元素就是從小到大排好序的了。
2>下面介紹一下氣泡排序。氣泡排序的主要思想是:如果相鄰兩個元素區域性無序,那麼將兩個元素交換,形成區域性有序。在第一遍掃瞄的時候,將最大值置於最後乙個位置。在第二遍掃瞄的時候,將僅次於最大值的值置於倒數第二個位置,以此類推,故名氣泡排序。具體**如下所示。
templatevoid vector::bubblesort(rank lo, rank hi) //氣泡排序
注:bubble方法返回的是bool值,這個值代表著這個向量是不是已經排好序。
下面貼出bubble方法的**。
templatebool vector::bubble(rank lo, rank hi)
} return sorted;
}
注:此方法只是檢測相鄰兩個元素的是不是有序。
下面貼出氣泡排序的示意圖。
注:圖示的解析已經比較清楚,故不再做進一步介紹。
3>下面介紹一下歸併排序。歸併排序,顧名思義也是將散的元素組合到一起,主要思想是:首先將元素較平均的分成兩堆,然後遞迴的將這個兩堆分別在分成兩堆,在最後分到每組最多隻剩下兩個元素的時候,開始整合。整合主要實現是將兩個組中的隊首元素抽出來,比較兩個值的大小,將小的值拿出來,放到第一位,以此類推,最後實現整個向量元素的排序。具體**如下所示。
templatevoid vector::mergesort(rank lo, rank hi)
注:此處使用遞迴將向量均分。
下面給出merge方法**。
templatevoid vector::merge(rank lo, rank mi, rank hi)
delete b;
}
下面給出歸併排序的示例圖,稍微有點亂,後期再進行更改吧。
經過這麼幾次的畫圖與查詢資料,自己收穫了很多。在以後的學習生涯中,應該持著仔細的態度,認真鑽研每乙個問題,任何乙個自己沒有懂的小點,裡面可能涉及到很多知識。尤其在指標這一塊,以後該繼續加強嘍。
資料結構之選擇排序
基本方法 從0索引開始,依次和後面元素比較,小的往前放,第一次完畢,最小值出現在了最小索引處,第二次找到第二小的值。具體是如何實現呢?第一輪是0索引上的資料依次跟後面各個索引上的資料進行比較,直到遇到乙個比它小的資料,這時候,這個小的資料就替換掉0索引上原來的資料,接著這個替換掉的資料繼續跟它原來的...
資料結構之選擇排序
選擇排序應該是最容易實現的一種排序方法,其原理很簡單,依舊分為兩塊資料,左邊選取資料與右邊的資料進行比較,取最小值,比較到最後的位置後交換資料,確保每一次比較中最小值都會調整到左邊並有序增加,實質上就是取最小值的函式,只不過外層包了乙個迴圈。void selectionsort int arr,in...
資料結構之vector
vector是c 中的一種序列式容器,依靠其下標索引來訪問獲取容器內容。vector和array同為序列式容器,其資料格式 操作等方面都十分相似,其最大不同點在於它們對於記憶體空間的使用。array是靜態陣列,使用者必須把握好其資料數量,一次性分配合理的記憶體空間。否則array會在新增新元素而空間...