氣泡排序是比較簡單的o(n2)級別的排序演算法,思路是挨個比較鄰近的數值,然後交換位置,就像在水裡的泡泡一樣,總能把最大的或者最小的交換到最上層。
/**
* 氣泡排序
*/template
<
typename t>
void
bubble_sort
(t arr,
int length)}}
}
選擇排序的演算法級別也是o(n2),思路是從第乙個索引開始,與剩下的進行比較,並記錄最下的值的索引,依次比較下去。如果當前索引和初始的索引不同,那麼需要交換值。此時最小的元素排在了前面。然後依次類推。
/**
*選擇排序
*/template
<
typename t>
void
select_sort
(t arr,
int length)}if
(minindex!=i)
}}
插入排序,假設前面的資料是排列完整的,那麼需要把當前的值與它前面的依次比較,直到遇到大於的位置,然後插入到其中。一般實現的時候可以選擇依次交換位置,也可以進行賦值。
具體實現如下:
/**
* 插入排序 交換數值
*/template
<
typename t>
void
insert_sort
(t arr,
int length)}}
}
可以對其進行優化,不需要每次都進行交換鄰近,這樣勢必會浪費空間和時間,可以賦值操作
template
<
typename t>
void
insert_sort2
(t arr,
int length)
if(j!=i)
}}
從**中也可以看出,插入排序對大部分排好的序列是很快的。
插入排序是採用1步長進行排序的,而希爾排序在插入排序的基礎上,先採用大步長,只到1步長為止,思想從整體上使得序列基本有序。
/**
*希爾排序
* */
template
<
typename t>
void
shell_sort
(t arr,
int length)
cout <<
"gap = "
<< gap << endl;
// 間隔gap 進行插入排序
while
(gap>0)
} gap = gap/3;
}}
就是不斷的把乙個陣列,對半分成兩份,只到最後不能再分,然後再向上進行排序合併,典型的遞迴的思想
/**
*歸併排序
* 分為左右,然後排序,然後合併 開闢臨時記憶體空間
*/template
<
typename t>
void
merge_sort
(t arr,
int length)
template
<
typename t>
void
__merge_sort
(t arr,
int l,
int r)
int mid = l +
(r-l)/2
;//(r+l)/2;
__merge_sort
(arr, l, mid)
;__merge_sort
(arr, mid+
1, r)
;// [l, mid] [mid+1, r]
t * aux =
new t[r-l+1]
;for
(int i=l; i<=r; i++
)int i = l, j = mid+1;
for(
int k = l; k <= r; k++
)else
if(j > r)
else
if(aux[i-l]
< aux[j-l]
)else
}delete
aux;
}
快速排序的思想也是分而治之,首選需要選擇乙個基本值,然後小於基本值的在陣列的左半邊,大於的在右半邊,中間部分是基本值,然後依次在對基本值的左邊遞迴,對右半邊也遞迴。
/**
*快速排序 需要選擇基準的資料,預設第乙個,也可以隨機選擇
*/template
<
typename t>
void
quick_sort
(t arr,
int length)
template
<
typename t>
void
__quick_sort
(t arr,
int l,
int r)
int index =
__partition
(arr, l, r)
;__quick_sort
(arr, l, index-1)
;__quick_sort
(arr, index+
1, r);}
template
<
typename t>
int__partition
(t arr,
int l,
int r)
swap
(arr[l]
, arr[j]);
return j;
首先要了解什麼是堆,堆其實就是乙個二叉樹,分為大頂推和小頂推,由小到大排序,一般小頂推。小頂堆的父節點的值小於兩個孩子節點的值。具體可以去看堆的定義,這裡就不多說了。
/**
* 對元素組的堆排序
*/template
<
typename t>
void
heap_sort
(t arr,
int length)
for(
int i = length-
1; i >=
0; i--)}
template
<
typename t>
void
__siftdown
(t arr,
int length,
int k)
if(arr[k]
>= arr[i]
)break
;swap
(arr[k]
, arr[i]);
k = i;
}}
參考: C 常用排序演算法
sort 對容器內元素進行排序 random shuffle 洗牌,指定範圍內的元素隨機調整次序 merge 容器元素合併,並儲存在另一容器中 reverse 反轉指定範圍的元素 1 sort 對容器內元素進行排序 函式原型 sort iterator beg,iterator end,pred 按...
常用排序演算法 C實現
1.1 氣泡排序 演算法描述 所給的n個數中,先拿第乙個數來和第二個比較,然後讓較大的乙個排在後面 即如果n1 n2,則讓n1與n2交換位置 然後又拿第二個數來和第三個數比較,又把較大的乙個排在後面,如此往下做下去,直到第n 1個數和第n個數比較完後,最大的那個數就會被公升到了最後面來.接下來又照同...
C 實現常用排序演算法
原理 利用快速排序對乙個集合進行排序,任取集合的乙個元素,以這個元素為比較,所有比這個值大的放在右邊,小的值放在左邊,然後分別對左右區間進行遞迴排序。快速排序 public int sortunit listlist int low,int hign where t icomparable list...