常用排序演算法C

2021-10-03 19:20:36 字數 3587 閱讀 5839

氣泡排序是比較簡單的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...