程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 舉例講授C說話對合並排序算法的基本應用

舉例講授C說話對合並排序算法的基本應用

編輯:關於C++

舉例講授C說話對合並排序算法的基本應用。本站提示廣大學習愛好者:(舉例講授C說話對合並排序算法的基本應用)文章只能為提供參考,不一定能成為您想要的結果。以下是舉例講授C說話對合並排序算法的基本應用正文


基本概念
百度百科是這麼描寫合並排序的:
合並操作(merge),也叫合並算法,指的是將兩個曾經排序的序列歸並成一個序列的操作。
設稀有列

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

初始狀況:

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

比擬次數 

  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個已排好序的數組歸並到數組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){//將一個數組分紅2個數組,前length-1為第一個,最初一個為第二個,然後歸並2個數組 
    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)。而且因為合並算法是固定的,不受輸出數據影響,所以它在最好、最壞、均勻情形下表示簡直雷同,均為O(㏒n)。
然則,合並排序最年夜的缺點在於其空間龐雜度。從下面的代碼可以看到,在歸並子數組的時刻須要一個幫助數組,然後再把這個數據拷貝回原數組。所以,合並排序的空間龐雜度(額定空間)為O(n)。可弗成以省略這個數組呢?不可!假如撤消幫助數組而又要包管本來的數組中數據不被籠罩,那就必需要在數組中消費年夜量時光來挪動數據。不只輕易失足,還下降了效力。是以這個幫助空間是少不失落的。

算法穩固性
由於我們在碰到相等的數據的時刻必定是按次序“繕寫”到幫助數組上的,所以,合並排序異樣是穩固算法。

算法實用場景
合並排序在數據量比擬年夜的時刻也有較為精彩的表示(效力上),然則,其空間龐雜度O(n)使得在數據量特殊年夜的時刻(例如,1萬萬數據)簡直弗成接收。並且,斟酌到有的機械內存自己就比擬小,是以,采取合並排序必定要留意。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved