思想:從前往後遍歷,每次把未排序陣列中最大的元素交換到陣列最後。
**實現:2個for迴圈,第乙個迴圈表示冒泡次數,第二個迴圈從前往後遍歷未排序陣列,如果前面的元素大於後面的元素,交換,直至到達已排序部分的最前面
void
bubblesort
(int a,
int left,
int right)}}
}
快速排序也是通過比較交換元素達到最終陣列有序,快速排序比氣泡排序快在其使用了分治的方法。
通常以第乙個元素為軸,使用雙指標遍歷陣列,指標i
ii從前向後與軸元素對比,指標j
jj從後向前與軸元素對比。
如果指標i
ii的元素大於軸元素,指標j
jj的元素小於軸元素,交換;最後交換軸元素到指標i
ii和指標j
jj的交匯點。
這樣一趟掃瞄之後,軸元素左邊的元素都小於軸元素,右邊的元素都大於軸元素,繼續分治。
void
quicksort
(int a,
int left,
int right)
} a[left]
= a[i]
; a[i]
= base;
quicksort
(a, left, i-1)
;quicksort
(a, i+
1, right)
;}
思想:對於未排序部分[i,
n]
[i,n]
[i,n
],選擇最小的元素與a[i
]a[i]
a[i]
交換;這樣,每次掃瞄,前面的已排序部分長度加一。
void
insertsort
(int a,
int left,
int right)
a[j]
= temp;
}}
什麼是堆?完全二叉樹,結點的值大於其左右子樹的值。
如果結點的值小於左子樹或者右子樹的值怎麼辦?把左右子樹中較大的值和結點的值交換。交換後還要判斷換下來的值是否還是小於其左子樹或者右子樹,如果是,繼續交換。
這一操作即下面的**中的sif
t(
)sift()
sift()
函式什麼是堆排序呢?因為堆的性質,最大的結點肯定是根節點,把根節點交換到陣列最後,這個時候最後的結點到了根節點,堆被破壞了,對未排序陣列重新sif
t(
)sift()
sift()
,再把根節點與未排序陣列(即堆)的最後結點交換,直至整個陣列有序。
另外,堆是二叉樹,但是用陣列實現正好可以利用完全二叉樹的性質:當前結點的下標為i
ii,左孩子結點的下標為2∗i
2*i2∗
i,右孩子結點的下標為2∗i
+1
2*i+1
2∗i+
1
void
sift
(int a,
int k,
int m)
if(a[i]
> a[t]
)break
;int temp = a[i]
; a[i]
= a[t]
; a[t]
= temp;
i = t;
left =
2* i;}}
void
heapsort
(int a,
int left,
int right)
for(
int i =
0; i < right-left; i++
)}
思想:將要插入的元素(陣列中未排序的元素)從後向前與被插入陣列(已有序陣列)中的元素比較,如果比當前元素小,陣列元素右移;直至找到插入位置。
void
insertsort
(int a,
int left,
int right)
a[j]
= temp;
}}
插入排序的一種,選取乙個增量d,陣列元素對於增量d進行直接插入排序,增量d不斷減小至1;這時整個陣列有序。
通常增量d選取陣列長度一半,折半減少。
void
shellsort
(int a,
int left,
int right)
a[j]
= temp;}}
}
以上排序演算法只是簡要介紹了實現方法,關於時間複雜度等問題並沒有討論。水平有限,有不當之處歡迎批評指正。 資料結構 資料結構中常用的排序演算法
排序是資料結構中重要的內容,也是面試過程中經常涉及的部分。在這裡,我給出幾個基本的排序演算法的c c 對於具體的排序的原理,不做太多的介紹,隨便找一本資料結構教材都能弄清楚。宣告 1 以下給出的 並沒有判斷邊界條件,只是給出了演算法的核心 如果遇到具體的問題,應該加以判斷。2 演算法實現的是公升序排...
複習資料結構 排序演算法(二) 氣泡排序
這篇複習氣泡排序。氣泡排序也是一種穩定排序 內排序。氣泡排序的基本思想 對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即 每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。插入排序比氣泡排序快!上面說的是普通的氣泡排序演算...
資料結構複習 常用排序演算法小結
演算法特點 面試考點 選擇排序演算法準則 比較類,非比較類 平均的時間效能 時間複雜度為 o nlogn 快速排序 堆排序和歸併排序 時間複雜度為 o n 2 直接插入 冒泡和簡單選擇排序 時間複雜度為 o n 基數排序 當待排記錄序列按關鍵字順序有序時 直接插入和氣泡排序 o n 快速排序 o n...