選擇 冒泡 合併 快速 插入排序演算法實現及效能分析

2021-08-14 16:07:18 字數 2933 閱讀 9840

選擇排序、氣泡排序、合併排序、快速排序、插入排序的演算法思想和實現,以及時間複雜度比較。

以下排序演算法均沒有進行優化,而是採用最符合原始演算法思想的方式進行實現和比較。

選擇排序的思想與演算法實現:

找出待排序的數列中的最小(或最大)元素,與待排序的數列的隊首元素進行交換,隊首元素併入已排序數列,直至待排數列的所有元素均已排完。

void selectsort(int array, int length)

//將最小值與當前指定元素交換

if(i != temp)}}

t(n) = an² + bn + c

平均情況:o(n²)

最好情況:o(n²)

最壞情況:o(n²)

氣泡排序的思想與演算法實現:

按順序訪問待排序的數列,一次比較兩個相鄰元素,如果他們的大小關係不對就交換他們的值,遍歷一趟待排數列便會把待排數列中的最大(或最小值)移動到隊末,將該最值併入已排數列,重複訪問待排序直至待排數列中的元素均已排完。

void bubblesort(int array,int length)

} }}

t(n) = an² + bn + c

平均情況:o(n²)

最好情況:o(n²)

最壞情況:o(n²)

合併排序的思想與演算法實現:

將無序的數列分成兩個無序子串行,再將所有無序子串行各分成兩個無序子串行,直至所有子串行只含乙個元素;將子串行合併成有序數列,相當於先分解再求解再合併。

合併操作需要建立或傳遞乙個大小等於兩個待合併序列之和的空序列,將兩個待排子序列的隊首元素進行比較,將較小的元素按順序賦值給空序列,如果有乙個子串行的元素全部賦值完,便將另乙個子串行的所有值按順序賦值給空序列。

void mergesort(int array, int length)

void mergesort(int array, int first, int last, int array2)

}void merge(int array, int first, int middle, int last, int array2)

while(n1 <= n2)

array2[i++] = array[n1++];

while(m1 <= m2)

array2[i++] = array[m1++];

//將array2中的有序數列重新賦值會array

for(j = 0; j < i; j++)

array[first + j] = array2[j];

}

t(n) = 2t(n/2)+o(n)遞推

= nlogn

平均情況:o(nlogn)

最好情況:o(nlogn)

最壞情況:o(nlogn)

快速排序的思想與演算法實現:

將隊首元素視為key,比

key小的值移動到左邊,比

key大的值移動到右邊,完成後以

key為分界線將序列分成兩個子串行,每個子串行再重複進行上訴操作直至排序完成,相當於先求部分解再分解。

void quicksort(int array, int low, int high)

int first = low;

int last = high;

int key = array[first];

while(first < last)

if(firstt(n) = 2t(n/2)+o(n)遞推

=at(n/b)+d(n)+c(n)

= nlogn + n

平均情況:o(nlogn)

最好情況:o(nlogn)

最壞情況:o(n²)

插入排序的思想與演算法實現:

從第二個元素開始,逆序與左邊的元素依次做比較,直到遇到不比它大的元素,便將其插入到該元素後面,再從第三個元素開始迴圈,直至最後乙個元素完成插入。

void insertsort(int array,int length)

//將key插入到這個比它小的數的右邊

array[j + 1] = key;

}}

t(n) = an² + bn + c

平均情況:o(n²)

最好情況:o(n)

最壞情況:o(n²)

實際測試時間複雜度:快速排序

< 合併排序

<

插入排序

<

選擇排序

<

氣泡排序。

win10+visual studio2015環境測試,int型陣列

陣列大小為10000-50000(縱座標為時間單位us,表示所消耗的時間)

其中快速排序比合併排序快:

合併排序和快速排序都需要進行遞迴函式呼叫,但合併排序需要建立陣列空間進行合併操作,快速排序只需在初始陣列中進行交換賦值,所以合併排序的耗時比快速排序多。

陣列大小為100、1000、10000、100000、100000。

冒泡 選擇 插入排序演算法

1.氣泡排序 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數 也就是第一波冒泡完成 針對所有的元素重複以上的步驟,除了最後乙個。持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。...

排序演算法 冒泡 選擇 插入排序

本文簡單總結一下三大排序演算法,如有不足,請多多提意見。簡述 從小到大排序,每次比較兩個元素,看他們的順序有沒有錯,如果錯了就換過來。a 比較abc.元素,如果第乙個比第二個大,則將兩個元素交換位置 bac.再依次將a和c進行比較。b 對每一對相鄰的元素做同樣的工作,從第一對到最後一對。這一次執行完...

排序演算法 冒泡 選擇 插入排序

外層迴圈控制大排序次數,內層迴圈控制每次大排序的排序次數 一次大排序就可以把最小的資料放在最前面。1 對陣列中的各資料,依次比較相鄰的兩個元素的大小 2 如果前面的資料大於後面的資料,就交換著兩個資料。經過第一 排序後,便可把最小的資料排好。3 然後再用同樣的方法吧剩下的資料逐個比較,最後得到從小到...