欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

舉例講解C語言對歸并排序算法的基礎使用

 更新時間:2016年05月04日 11:47:41   作者:飛翔的貓咪  
這篇文章主要介紹了C語言對歸并排序算法的使用,歸并排序算法的平均事件復雜度為(n\log n),需要的朋友可以參考下

基礎概念
百度百科是這么描述歸并排序的:
歸并操作(merge),也叫歸并算法,指的是將兩個已經排序的序列合并成一個序列的操作。
設有數(shù)列

{6,202,100,301,38,8,1}

初始狀態(tài):

[6] [202] [100] [301] [38] [8] [1] 

比較次數(shù) 

  i=1 [6 202 ] [ 100 301] [ 8 38] [ 1 ] 3
 
  i=2 [ 6 100 202 301 ] [ 1 8 38 ] 4
 
  i=3 [ 1 6 8 38 100 202 301 ] 4

總計: 11次

實例

#include <stdio.h> 
void printArr(int arr[],int length){ 
    int i; 
    for(i=0;i<length;i++){ 
        printf("%d,",arr[i]); 
    } 
    printf("\n"); 
} 
void merge(int a[],int alength,int b[],int blength,int c[]){//將2個已排好序的數(shù)組合并到數(shù)組c 
    int i=0,j=0,k=0; 
    while(1){ 
        if(a[i]<=b[j]){ 
            c[k] = a[i]; 
            i++; 
            k++; 
            if(i==alength){ 
                for(;j<blength;j++,k++){ 
                    c[k] = b[j]; 
                } 
                break; 
            } 
        }else{ 
            c[k] = b[j]; 
            j++; 
            k++; 
            if(j==blength){ 
                for(;i<alength;i++,k++){ 
                    c[k] = a[i]; 
                } 
                break; 
            } 
        } 
    } 
    printArr(c,k); 
 
} 
void mergeSort(int arr[],int length){//將一個數(shù)組分成2個數(shù)組,前l(fā)ength-1為第一個,最后一個為第二個,然后合并2個數(shù)組 
    if(length > 1){ 
        int arr1[length-1],arr2[1] = {arr[length-1]}; 
        int i; 
        for(i=0;i<length-1;i++){ 
            arr1[i] = arr[i]; 
        } 
        mergeSort(arr1,length-1);//遞歸的調用自己 
        merge(arr1,length-1,arr2,1,arr); 
    } 
} 
 
int main(void){ 
    int a[10] = {3,54,16,8,123,8,89,23,87,2}; 
    printArr(a,10); 
    mergeSort(a,10); 
    return 0; 
 
} 

算法性能/復雜度
歸并排序的效率是很高的,由于遞歸劃分為子序列只需要logN復雜度,而合并每兩個子序列需要大約2n次賦值,為O(n)復雜度,因此,只需要簡單相乘即可得到歸并排序的時間復雜度 O(㏒n)。并且由于歸并算法是固定的,不受輸入數(shù)據(jù)影響,所以它在最好、最壞、平均情況下表現(xiàn)幾乎相同,均為O(㏒n)。
但是,歸并排序最大的缺陷在于其空間復雜度。從上面的代碼可以看到,在合并子數(shù)組的時候需要一個輔助數(shù)組,然后再把這個數(shù)據(jù)拷貝回原數(shù)組。所以,歸并排序的空間復雜度(額外空間)為O(n)。可不可以省略這個數(shù)組呢?不行!如果取消輔助數(shù)組而又要保證原來的數(shù)組中數(shù)據(jù)不被覆蓋,那就必須要在數(shù)組中花費大量時間來移動數(shù)據(jù)。不僅容易出錯,還降低了效率。因此這個輔助空間是少不掉的。

算法穩(wěn)定性
因為我們在遇到相等的數(shù)據(jù)的時候必然是按順序“抄寫”到輔助數(shù)組上的,所以,歸并排序同樣是穩(wěn)定算法。

算法適用場景
歸并排序在數(shù)據(jù)量比較大的時候也有較為出色的表現(xiàn)(效率上),但是,其空間復雜度O(n)使得在數(shù)據(jù)量特別大的時候(例如,1千萬數(shù)據(jù))幾乎不可接受。而且,考慮到有的機器內存本身就比較小,因此,采用歸并排序一定要注意。

相關文章

  • C/C++仿華容道小游戲

    C/C++仿華容道小游戲

    這篇文章主要介紹了C/C++仿華容道小游戲的相關資料,模仿實現(xiàn)華容道游戲,感興趣的朋友可以參考一下
    2016-02-02
  • C語言運算符與表達式

    C語言運算符與表達式

    這篇文章主要介紹了C語言運算符與表達式,表達式是C語言的主體。在C語言中,表達式由操作符和操作數(shù)組成,更多相關介紹需要的小伙伴可以參考下面文章內容
    2022-07-07
  • C++ 單例模式的幾種實現(xiàn)方式研究

    C++ 單例模式的幾種實現(xiàn)方式研究

    單例模式,可以說設計模式中最常應用的一種模式了,據(jù)說也是面試官最喜歡的題目。但是如果沒有學過設計模式的人,可能不會想到要去應用單例模式,面對單例模式適用的情況
    2019-01-01
  • C++編譯器Clion的使用詳解(總結)

    C++編譯器Clion的使用詳解(總結)

    Clion有一個比較讓人郁悶的地方就是必須要把編譯環(huán)境配置好了,IDE才去做代碼分析等動作,但是還是有很多優(yōu)點,本文重點給大家介紹C++編譯器Clion的使用,感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • 詳解C++編程中類的聲明和對象成員的引用

    詳解C++編程中類的聲明和對象成員的引用

    這篇文章主要介紹了詳解C++編程中類的聲明和對象成員的引用,是C++入門學習中的基礎知識,需要的朋友可以參考下
    2015-09-09
  • 詳解C++中String類模擬實現(xiàn)以及深拷貝淺拷貝

    詳解C++中String類模擬實現(xiàn)以及深拷貝淺拷貝

    這篇文章主要介紹了詳解C++中String類模擬實現(xiàn)以及深拷貝淺拷貝的相關資料,希望通過本文能幫助到大家,讓大家實現(xiàn)這樣的方法,需要的朋友可以參考下
    2017-10-10
  • 對C語言編程標準以及聲明的基本理解

    對C語言編程標準以及聲明的基本理解

    這篇文章主要介紹了對C語言編程標準以及聲明的基本理解,有助于對C語言編寫時的結構有更加清晰的認識,需要的朋友可以參考下
    2015-11-11
  • C++排序算法之插入排序解析

    C++排序算法之插入排序解析

    這篇文章主要介紹了C++排序算法之插入排序解析,將數(shù)組分為有序表和無序表,每次從有序表中取出一個元素,插入到有序表的適當位置,每遍歷一次,有序表中元素增加一個,無序表中元素個數(shù)減少一個,重復n-1次,完成排序,需要的朋友可以參考下
    2023-10-10
  • C語言中經socket接收數(shù)據(jù)的相關函數(shù)詳解

    C語言中經socket接收數(shù)據(jù)的相關函數(shù)詳解

    這篇文章主要介紹了C語言中經socket接收數(shù)據(jù)的相關函數(shù)詳解,分別為recv()函數(shù)和recvfrom()函數(shù)以及recvmsg()函數(shù)的使用,需要的朋友可以參考下
    2015-09-09
  • 解析C++哈夫曼樹編碼和譯碼的實現(xiàn)

    解析C++哈夫曼樹編碼和譯碼的實現(xiàn)

    本篇文章主要介紹了C++哈夫曼樹編碼和譯碼的實現(xiàn),詳細的講訴了哈夫曼樹編碼的原理,有需要的同學可以了解一下。
    2016-11-11

最新評論