日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

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

 醉人說夢 2020-04-13

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

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

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

找出待排序的數(shù)列中的最?。ɑ蜃畲螅┰?,與待排序的數(shù)列的隊首元素進(jìn)行交換,隊首元素并入已排序數(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)

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

按順序訪問待排序的數(shù)列,一次比較兩個相鄰元素,如果他們的大小關(guān)系不對就交換他們的值,遍歷一趟待排數(shù)列便會把待排數(shù)列中的最大(或最小值)移動到隊末,將該最值并入已排數(shù)列,重復(fù)訪問待排序直至待排數(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ù)進(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)

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

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

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

  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時,繼續(xù)分成兩個子序列
  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. //將兩個有序子序列按順序合并到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ù)列重新賦值會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)

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

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

  1. void QuickSort(int array[], int low, int high)
  2. {
  3. //當(dāng)待排數(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ù)移動到左邊,比key大的移動到右邊
  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ù)列的第一個元素放到數(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)

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

從第二個元素開始,逆序與左邊的元素依次做比較,直到遇到不比它大的元素,便將其插入到該元素后面,再從第三個元素開始循環(huán),直至最后一個元素完成插入。

  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ù)往右移動,直到遇到第一個比key小的數(shù)
  7. while (j > 0 && array[j] > key) {
  8. array[j + 1] = array[j];
  9. j = j - 1;
  10. }
  11. //將key插入到這個比它小的數(shù)的右邊
  12. array[j + 1] = key;
  13. }
  14. }

T(n) = an2 + bn + c

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

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

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

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


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

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


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


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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多