1. 程式人生 > >對二分法的學習體會以及關於結對編程的體驗分享

對二分法的學習體會以及關於結對編程的體驗分享

進一步 計算機 我們 思想 == article 利用 quick 函數

對二分法的學習體會以及關於結對編程的體驗分享

1) 二分搜索技術

  1. 二分搜索算法是運用分治策略的典型例子。二分搜索方法充分利用了元素間的次序關系,采用分治策略,可在最壞的情況下用O(logn)時間完成搜索任務。
  2. 問題描述:給定已排好序的n個元素a[0: n-1],現要在這n個元素中找出特定的元素x
  3. 解決方法:

    a) 順序搜索方法:逐個比較a[0: n-1]中元素,直至找出元素或搜索整個數組後確定x不在其中。該方法沒有很好地利用n個元素已排好序這個條件,因此在最壞的情況下,順序搜索方法需要O(n) 次比較。

    b) 二分搜索方法:將n個元素分成個數大致相同的兩半,取a[n/2]x作比較。如果

x = a[n/2],則找到x,算法終止;如果x < a[n/2],則只在數組a的左半部繼續搜索x;如果x > a[n/2],則只在數組a的右半部繼續搜索x。具體算法可描述如下:

int BinarySearch(Type a[], const Type& x, int n){
    //在a[0] <= a[1] <= ... <= a[n-1]中搜索x
    //找到x時返回其在數組中的位置,否則返回-1
    int left = 0, right = n - 1;
    while(left <= right){
        int mid = (left + right) / 2
; if (x == a[mid]) return mid; else if (x > a[mid]) left = mid + 1; else right = mid - 1; } }

    c) 可以看出,每執行一次算法的while循環,待搜索數組的大小減小一半。因此,在最壞情況下,while循環被執行了O(logn)次。循環體內運算需要O(1)時間,因此整個算法在最壞情況下的計算時間復雜性為O(logn)

2) 二分排序技術

  1. 問題描述:給定無序的n個元素a[0: n-1],編寫一個程序輸出該數組的有序序列a[0: n-1]
  2. 解決方法:

    a) 歸並排序:用分治策略實現對n個元素進行排序的算法。基本思想就是將待排序元素分成大小大致相同的2個子集合,分別對2個子集合進行排序,最終將排好序的子集合合並成為所要求的排好序的集合。

    歸並排序實現代碼如下:

void MergeSort(Type a[], int left, int right)
{    //A[left:right]是一個全程數組,
    //含有 right-left+1個待排序的元素。
    if (left < right){  //至少有2個元素
        int mid = (left + right) / 2;  //求當前數組的分割點
        MergeSort(a, left, mid);  
        MergeSort(a, mid + 1, right);  
        Merge(a, b, left, mid, right);  //合並兩個排好序的子問題,放入另一個數組b中
        copy(a, b, left, right);
    }
}

    計算出歸並排序的時間復雜度T[n] = O(nlogn)

    b) 快速排序:將數組A[1:n]分解成兩個子數組B[1:p]B[p+1:n],使得B[1:p]中的元素均不大於B[p+1:n]中的元素,然後分別對這裏兩個數組中的元素進行排序(非降的),最後再把兩個排好序的數組接起來即可。

    快速排序實現代碼如下:

void QuickSort(Type a[], int p, int r){
     if(p < r){
        int q = Partition(a, p, r);  //Partition函數負責將a進行一次分割,返回分割元素的位置
        QuickSort(a, p, q - 1);  //對左半段排序
        QuickSort(a, q + 1, r);  //對右半段排序
     }
} 

    計算出快速排序的時間復雜度T(n) = O(nlogn)

    c) 但當數據量越來越大時,歸並排序比快速排序慢,快速排序的優勢愈發明顯。

    閱讀:https://blog.csdn.net/jymn_chen/article/details/17359003

3) 相關資料:

  a) 高等學校規劃教材《計算機算法設計與分析》 王曉東著

  b) 思想:https://blog.csdn.net/u011082606/article/details/47834519

  c) 實踐:https://blog.csdn.net/jacob_007/article/details/52601847

  d) 改進:https://blog.csdn.net/lxs2016/article/details/75125217

  e) 快速排序與歸並排序的比較:

  https://blog.csdn.net/jymn_chen/article/details/17359003

  https://blog.csdn.net/louiswang2009/article/details/5616064

4) 結對編程情況

  1. 課堂上:在算法課堂上我和我的partner會不時的交流問題,共同學習並理解課堂上老師講述的內容。
  2. 課後交流:課後我們除了會繼續討論課堂上沒有解決的問題(通過問老師、查資料等),也會就作業的一些特點發表自己的看法,在各自單獨完成作業後再進行交流。
  3. 對於具體的一個編程任務,我們先在某些關鍵代碼思想上進行交流,並盡量達成共識,而後再各自獨立完成任務,之後再進行代碼的分享與進一步交流。

對二分法的學習體會以及關於結對編程的體驗分享