Insertion Sort and Merge Sort

  • 2021 年 4 月 24 日
  • 筆記

Insertion Sort(插入排序)

思路:for 循環遍曆數組中的每一個數

   用while將每次遍歷到的數於左側的數進行對比,將小的排到左邊

void InsertionSort(int*A, int n){
    int key,i=0,p;
    for(p=0;p<n;p++){
        key=A[p];
        i=p-1;
        while(i>=0 && A[i]>key){
            A[i+1]=A[i];
            i=i-1;
        }
        A[i+1]=key;
    }
}

中規中矩的排序方法

時間複雜度:

Best-case Running time  : O(n)(數組已經被排好序的情況)

Worst-case Running Time :  O(n^2)

Average Running Time :  O(n^2)

從時間複雜度來看,處理少量數據還可以。當數據量較為龐大時,速度就很慢了

 

Merge Sort

思路:利用遞歸將數組分成兩個相同大小的部分,直至長度為1

   然後利用merge函數分別對每個部分進行排序

   最後重新放在一起

void Merge(long int*A,long int left,long int center,long int right){
    long int i1=left,i2=center+1,i=0,j;
    long int B[100000];
    long int length =sizeof(B)/sizeof(B[0]);
//比較左右兩側的大小,然後將小的的放入數組B
    while (i1<=center && i2<=right)
    {   
        if(A[i1]>A[i2]){
            B[i++]=A[i2++];
        }else{
            B[i++]=A[i1++];
        }
    }
//將左側或者右側剩餘的數以此放入數組B中
    for(;i1<=center;i1++){
        B[i++]=A[i1];
    }
    for(;i2<=right;i2++){
        B[i++]=A[i2];
    }
//將數組B中排好序的值賦給A
//由於每調用一次函數,B數組都會重新創建,因此B從0開始,A從left開始
    for(j=0,i=left;j<=right-left;j++,i++){
        A[i]=B[j];
    }
    
}

void MergerSort(long int*A,long int left,long int right){
    long int center=0;
    if(left>=right){
        return ;
    }
    center=(left+right)/2;
//這種先進行第一個遞歸,直至最後,沒進行一次就相當於建立一層平台,當進行完後再返回上一層,執行下一個語句
    MergerSort(A,left,center);
    MergerSort(A,center+1,right);
    Merge(A,left,center,right);
}

這個就是merge sort 的排序過程:

 

個人覺得遞歸部分的代碼不是很好理解,其餘部分都還可以

時間複雜度: