乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      選擇、冒泡、合并、快速、插入排序算法實(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)買(mǎi)等信息,謹(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)論公約

        類(lèi)似文章 更多