一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

選擇、冒泡、合并、快速、插入排序算法實(shí)現(xiàn)及性能分析

 醉人說(shuō)夢(mèng) 2020-04-13

選擇排序、冒泡排序、合并排序、快速排序、插入排序的算法思想和實(shí)現(xiàn),以及時(shí)間復(fù)雜度比較。

以下排序算法均沒(méi)有進(jìn)行優(yōu)化,而是采用最符合原始算法思想的方式進(jìn)行實(shí)現(xiàn)和比較。

選擇排序的思想與算法實(shí)現(xiàn):

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

  1. void SelectSort(int array[], int length){
  2. int temp,key,i,j;
  3. for(i = 0; i< length - 1; i++){
  4. temp = i;
  5. //遍歷待排序數(shù)組,找到其中的最小值
  6. for(j = i + 1; j < length; j++){
  7. if(array[temp] > array[j])
  8. temp = j;
  9. }
  10. //將最小值與當(dāng)前指定元素交換
  11. if(i != temp){
  12. key = array[temp];
  13. array[temp] = array[i];
  14. array[i] = key;
  15. }
  16. }
  17. }

T(n) = an2 + bn + c

平均情況:O(n2)
最好情況:O(n2)
最壞情況:O(n2)

冒泡排序的思想與算法實(shí)現(xiàn):

按順序訪問(wèn)待排序的數(shù)列,一次比較兩個(gè)相鄰元素,如果他們的大小關(guān)系不對(duì)就交換他們的值,遍歷一趟待排數(shù)列便會(huì)把待排數(shù)列中的最大(或最小值)移動(dòng)到隊(duì)末,將該最值并入已排數(shù)列,重復(fù)訪問(wèn)待排序直至待排數(shù)列中的元素均已排完。

  1. void BubbleSort(int array[],int length){
  2. int key,i,j;
  3. for(i = 0; i < length; i++){
  4. for(j = 0; j < length - i - 1; j++){
  5. //當(dāng)遍歷到左邊的數(shù)大于右邊時(shí),相鄰兩數(shù)進(jìn)行交換
  6. if(array[j] > array[j+1]){
  7. key = array[j];
  8. array[j] = array[j+1];
  9. array[j+1] = key;
  10. }
  11. }
  12. }
  13. }

T(n) = an2 + bn + c

平均情況:O(n2)
最好情況:O(n2)
最壞情況:O(n2)

合并排序的思想與算法實(shí)現(xiàn):

將無(wú)序的數(shù)列分成兩個(gè)無(wú)序子序列,再將所有無(wú)序子序列各分成兩個(gè)無(wú)序子序列,直至所有子序列只含一個(gè)元素;將子序列合并成有序數(shù)列,相當(dāng)于先分解再求解再合并。

合并操作需要?jiǎng)?chuàng)建或傳遞一個(gè)大小等于兩個(gè)待合并序列之和的空序列,將兩個(gè)待排子序列的隊(duì)首元素進(jìn)行比較,將較小的元素按順序賦值給空序列,如果有一個(gè)子序列的元素全部賦值完,便將另一個(gè)子序列的所有值按順序賦值給空序列。

  1. void MergeSort(int array[], int length){
  2. //創(chuàng)建等大數(shù)組用于合并子數(shù)列
  3. int *array2 = new int[length];
  4. if(array2 == NULL)
  5. return ;
  6. Mergesort(array, 0, length-1, array2);
  7. delete array2;
  8. }
  9. void Mergesort(int array[], int first, int last, int array2[]){
  10. //當(dāng)數(shù)組元素大于1時(shí),繼續(xù)分成兩個(gè)子序列
  11. if(first < last){
  12. int middle = (first + last)/2;
  13. Mergesort(array, first, middle, array2);
  14. Mergesort(array, middle+1, last, array2);
  15. Merge(array, first, middle, last, array2);
  16. }
  17. }
  18. void Merge(int array[], int first, int middle, int last, int array2[]){
  19. int n1 = first, n2 = middle;
  20. int m1 = middle + 1, m2 = last;
  21. int i = 0,j = 0;
  22. //將兩個(gè)有序子序列按順序合并到array2中
  23. while(n1 <= n2 && m1 <= m2){
  24. if(array[n1] < array[m1])
  25. array2[i++] = array[n1++];
  26. else
  27. array2[i++] = array[m1++];
  28. }
  29. while(n1 <= n2)
  30. array2[i++] = array[n1++];
  31. while(m1 <= m2)
  32. array2[i++] = array[m1++];
  33. //將array2中的有序數(shù)列重新賦值會(huì)array
  34. for(j = 0; j < i; j++)
  35. array[first + j] = array2[j];
  36. }

T(n) = 2T(n/2)+O(n)遞推

= nlogn

平均情況:O(nlogn)
最好情況:O(nlogn)
最壞情況:O(nlogn)

快速排序的思想與算法實(shí)現(xiàn):

將隊(duì)首元素視為key,比key小的值移動(dòng)到左邊,比key大的值移動(dòng)到右邊,完成后以key為分界線將序列分成兩個(gè)子序列,每個(gè)子序列再重復(fù)進(jìn)行上訴操作直至排序完成,相當(dāng)于先求部分解再分解。

  1. void QuickSort(int array[], int low, int high)
  2. {
  3. //當(dāng)待排數(shù)組只剩一個(gè)元素時(shí),返回空
  4. if(low >= high)
  5. {
  6. return;
  7. }
  8. int first = low;
  9. int last = high;
  10. int key = array[first];
  11. while(first < last)
  12. {
  13. //將比key小的數(shù)移動(dòng)到左邊,比key大的移動(dòng)到右邊
  14. while(first < last && array[last] >= key)
  15. {
  16. --last;
  17. }
  18. if(first<last)
  19. array[first] = array[last];
  20. while(first < last && array[first] <= key)
  21. {
  22. ++first;
  23. }
  24. if(first<last)
  25. array[last] = array[first];
  26. }
  27. //將原本數(shù)列的第一個(gè)元素放到數(shù)組中正確的位置
  28. array[first] = key;
  29. //根據(jù)已排好的元素將數(shù)組分成兩部分,分別調(diào)用遞歸函數(shù)
  30. QuickSort(array, low, first-1);
  31. QuickSort(array, first+1, high);
  32. }

T(n) = 2T(n/2)+O(n)遞推=aT(n/b)+D(n)+C(n)

= nlogn + n

平均情況:O(nlogn)
最好情況:O(nlogn)
最壞情況:O(n2)

插入排序的思想與算法實(shí)現(xiàn):

從第二個(gè)元素開(kāi)始,逆序與左邊的元素依次做比較,直到遇到不比它大的元素,便將其插入到該元素后面,再?gòu)牡谌齻€(gè)元素開(kāi)始循環(huán),直至最后一個(gè)元素完成插入。

  1. void InsertSort(int array[],int length) {
  2. int key,i,j;
  3. for (i = 1; i < length; i++) {
  4. key = array[i];
  5. j = i - 1;
  6. //將key左邊比它大的數(shù)往右移動(dòng),直到遇到第一個(gè)比key小的數(shù)
  7. while (j > 0 && array[j] > key) {
  8. array[j + 1] = array[j];
  9. j = j - 1;
  10. }
  11. //將key插入到這個(gè)比它小的數(shù)的右邊
  12. array[j + 1] = key;
  13. }
  14. }

T(n) = an2 + bn + c

平均情況:O(n2)
最好情況:O(n)
最壞情況:O(n2)

實(shí)際測(cè)試時(shí)間復(fù)雜度:快速排序 < 合并排序 < 插入排序< 選擇排序< 冒泡排序。

win10+visual studio2015環(huán)境測(cè)試,int型數(shù)組

數(shù)組大小為10000-50000(縱坐標(biāo)為時(shí)間單位us,表示所消耗的時(shí)間)


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

合并排序和快速排序都需要進(jìn)行遞歸函數(shù)調(diào)用,但合并排序需要?jiǎng)?chuàng)建數(shù)組空間進(jìn)行合并操作,快速排序只需在初始數(shù)組中進(jìn)行交換賦值,所以合并排序的耗時(shí)比快速排序多。


數(shù)組大小為100、1000、10000、100000、100000。


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    暴力性生活在线免费视频| 欧美一级片日韩一级片| 熟女免费视频一区二区| 欧美色欧美亚洲日在线| 老司机精品视频免费入口| 久久精品国产第一区二区三区| 观看日韩精品在线视频| 久久99亚洲小姐精品综合| 蜜桃传媒在线正在播放| 微拍一区二区三区福利| 中文日韩精品视频在线| 亚洲中文在线中文字幕91| 高清一区二区三区大伊香蕉 | 丝袜破了有美女肉体免费观看 | 精品亚洲香蕉久久综合网| 久久综合亚洲精品蜜桃| 国产一区二区三区口爆在线| 免费观看一级欧美大片| 国产偷拍精品在线视频| 欧美又黑又粗大又硬又爽| 欧美午夜视频免费观看| 国产精品免费视频视频| 精品少妇人妻av免费看| 日韩一区二区三区免费av| 日韩人妻欧美一区二区久久| 日本和亚洲的香蕉视频| 亚洲最大的中文字幕在线视频| 亚洲第一视频少妇人妻系列| 深夜少妇一区二区三区| 又大又长又粗又猛国产精品| 国产精品乱子伦一区二区三区| 精品国产品国语在线不卡| 国产真人无遮挡免费视频一区| 色偷偷亚洲女人天堂观看| 欧美日不卡无在线一区| 亚洲精品熟女国产多毛| 欧美黑人暴力猛交精品| 国产一区二区三区口爆在线| 91一区国产中文字幕| 亚洲美女国产精品久久| 国产精品免费无遮挡不卡视频|