1. 程式人生 > >20172333 2018-2019-1 《程序設計與數據結構》第五周學習總結

20172333 2018-2019-1 《程序設計與數據結構》第五周學習總結

bject string election strong 編寫 -- 項目 near 簡單

20172333 2018-2019-1 《程序設計與數據結構》第五周學習總結

教材學習內容總結

==《Java軟件結構與數據結構》第九章-排序與查找==

一、查找

  • ①.查找概念: 在一個項目中尋找一個元素或者判斷一個元素是否存在在這個項目中。
  • ②.查找的類型: 查找在第九章主要討論了兩種類型,一種是線性查找、另一種是二分查找。
  • ③.查找的目標: 查找實際就是不同元素之間的比較過程,而查找的目標就是為了找到某個元素,在查找的同時保持最高效的性能。

二、線性查找法

  • ①.線性查找法的概念: 如果該項目為某類型的列表,則線性查找法的實現既是從頭到尾依次比較每一個值,直到找到或者遍歷到最後。
  • 線性查找示意圖技術分享圖片

  • ②.方法實現:

public static <T>   
        boolean linearSearch(T[] data, int min, int max, T target)
    {
        int index = min;
        boolean found = false;

        while (!found && index <= max) 
        {
            found = data[index].equals(target);
            index++;
        }

        return found;
    }

三、二分查找法

  • ①.二分查找概念: 二分查找每一次查找都將現有元素組縮減一半可行候選項,大大加強效率。圖二分
  • ②.二分查找前提要求: ==該元素組應該是已排序好了的。==
  • ③.二分查找法實現:
public static <T extends Comparable<T>>  
        boolean binarySearch(T[] data, int min, int max, T target)
    {  
        boolean found = false;
        int midpoint = (min + max) / 2;  // determine the midpoint

        if (data[midpoint].compareTo(target) == 0)
            found = true;

        else if (data[midpoint].compareTo(target) > 0)
        {
            if (min <= midpoint - 1)
                found = binarySearch(data, min, midpoint - 1, target);
        }
        
        else if (midpoint + 1 <= max)
            found = binarySearch(data, midpoint + 1, max, target);

        return found;
    }
  • ④.線性查找與二分查找的優劣比較:
    • 線性查找的優勢:在於比二分查找更加簡單,==調試與編程更容易==。線性查找==無需對隊列進行排序即可使用==
    • 二分查找的優勢:線性查找的時間復雜度為==O(n)==,二分查找的時間復雜度為==O(log2 n)==,在隨著n的變大,二分查找的效率會遠遠高於線性查找。

四、排序

  • ①.排序概念:
    • 1.排序是按照某個特定要求,對一組元素進行升序或者降序的規律進行排序。
    • 2.根據效率分為兩類排序:順序排序、對數排序
    • 3.順序排序根據方法實現不同分為三種:選擇排序、插入排序、冒泡排序。
    • 4.對數排序根據方法實現不同分為兩種:快速排序、歸並排序。

五、順序排序

  • ①選擇排序法概念: 遍歷一次列表所有元素,將最大或最小的元素放在第一位,然後再次遍歷該列表除此之外的元素,重復這些操作直到最後一位元素。選擇示意圖技術分享圖片

  • 代碼實現:

public class SelectionSort {
 
    public static void selectionSort(int[] a) {
        int n = a.length;
        for (int i = 0; i < n; i++) {
            int k = i;
            
            for (int j = i + 1; j < n; j++) {
                if (a[j] < a[k]) {
                    k = j;
                }
            }
    
            if (k > i) {
                int tmp = a[i];
                a[i] = a[k];
                a[k] = tmp;
            }
        }
    }
 
    public static void main(String[] args) {
        int[] b = { 49, 38, 65, 97, 76, 13, 27, 50 };
        selectionSort(b);
        for (int i : b)
            System.out.print(i + " ");
    }
}
  • ②插入排序法概念: 該排序法的用法就是從左第二元素開始向左或者右進行一個一個比較,每一次比較有兩種情況,若是按照從小往大排的話,提出的元素與它現有位置左邊的小則該元素向左移動一位,而之前的元素向後一位;如果提出元素比它左邊位置的大則停止該元素的比較,開始下一個元素的比較。
  • 插入排序法示意圖技術分享圖片

  • 插入排序法代碼實現:

public static void insertSort(int[] numbers)
    {
    int size = numbers.length;
    int temp = 0 ;
    int j =  0;
    
    for(int i = 0 ; i < size ; i++)
    {
        temp = numbers[i];
     
        for(j = i ; j > 0 && temp < numbers[j-1] ; j --)
        {
        numbers[j] = numbers[j-1];
        }
        numbers[j] = temp;
    }
    }
  • ③冒泡排序法概念: 這個排序方法在一定程度上與插入排序法相似,剛開始的步驟與插入排序相同,都是將一個元素與左邊或者右邊的元素比較,若是從小到大排序的前提,左邊元素大過右邊元素則向右一位繼續該步驟,但是一旦小於右邊元素,則該元素固定,剛剛較大的元素開始向右比較,以此類推。
  • 冒泡排序法示意圖技術分享圖片

  • 冒泡排序法代碼實現:

private static void bubbleSort(int[] sortNum)
    {
        int temp = 0;
        for (int i = 0; i < sortNum.length-1; i++) 
        {           
            for (int j = 0; j < sortNum.length-1-i; j++) 
            {       
                if(sortNum[j+1]<sortNum[j])
                {               
                    temp = sortNum[j];
                    sortNum[j] = sortNum[j+1];
                    sortNum[j+1] = temp;
                }
            }
        }
    }

五、對數排序

  • ①快速排序法概念: 這個方法引入了三個重要變量i、j、k,i為==左側變量==,j為==右側變量==,k為==基準值==。該方法開始時需選擇一個k(一般選擇的是第一個元素),(==第一次遍歷==)然後i變量從左邊一直遍歷到最右邊,每次將i所在元素與基準值比較,若是大於基準值的該元素與基準值進行互換位置。(==第二次遍歷==)從右邊開始將小於基準值的元素進行調換順序直到最左邊。此時基準值左邊的元素均小於基準值,而基準值右邊的元素均大於基準值,則此時分為兩個區域,對於這兩個區域繼續進行上述步驟直到無法分開。
  • 快速排序法圖示技術分享圖片

  • 快速排序法代碼實現:


public class QuickDemo {
    public static void main(String[] args) 
    {
        int[] arr = { 5,2,4,9,7 };
        sort(arr, 0, arr.length - 1);
    }
    public static void sort(int arr[], int low, int high) 
    {
        int l = low;
        int h = high;
        int k = arr[low];
        while (l < h) 
        {
        
            while (l < h && arr[h] >= k 
            { 
                h--;// h=6
            }
            if (l < h) 
            {
                int temp = arr[h];
                arr[h] = arr[l];
                arr[l] = temp;
                
                l++;
            }
        
            while (l < h && arr[l] <= k) 
            {  
                l++;
            }
            if (l < h) 
            {
                int temp = arr[h];
                arr[h] = arr[l];
                arr[l] = temp;
                h--;
            }
            
        }
        print(arr);
        System.out.print("l=" + (l + 1) + "h=" + (h + 1) + "k=" + k + "\n");
    
        if (l > low)
        if (h < high)
            sort(arr, l + 1, high);
    
  • ②歸並排序法概念: 這個方法在我看來是分為三步,第一步是分割的思想,將一組元素從中間開始分開,直到分到一個一個元素,第二步就是將分開的元素進行比較。第三步就是比較之後的合並為一組元素。
  • 歸並排序法圖示技術分享圖片

六、基數排序

  • 概念:這個方法會是利用元素的位數進行排序的,分為10個組內(0,1,2,3,4,...,9)第一次從第一位開始分(即個位)放在相應組內,然後按照從0到9的順序拿出來,再進行十位的放置,再按0到9的順序拿出,直到這些元素最高位結束
  • 直截了當的圖片解釋:
  • 個位排序圖
    技術分享圖片

  • 十位排序圖
    技術分享圖片

  • 百位排序圖
    技術分享圖片

教材學習中的問題和解決過程

  • 問題1:插入排序與冒泡排序他們之間排序過程中有許多相似之處那麽它們之間的效率方面究竟誰更好呢?
  • 解答:首先插入排序的時間復雜度為O (n^2),冒泡排序的時間復雜度為O (n^2)。所以光從時間復雜度上是無法判斷的,那麽我們可以直接定義他們效率相同嗎?顯然是不行的,在pp9.3的編寫過程中就明確規定要求出該問題的答案,在測試中可以一眼看出,冒泡排序花費的時間比插入排序少一些但是操作數遠大於插入排序圖對比
    冒泡:技術分享圖片
    插入:技術分享圖片

  • 問題2:在什麽情況下,二分排序法比順序排序法效率要高呢?
  • 解答:由於二分排序法的大多方法都是遞歸實現排序的,且數據越多,對二分排序法時間要求不高,而順序排序法則影響較大,如果要具體到多少個元素來判斷零界點的話,只能具體問題具體分析。

    代碼調試中的問題和解決過程

  • 問題1:在使用書上自帶的檢測類型時,發現超出範圍的問題。圖技術分享圖片

  • 解決:經過debug發現在第5個的時候超出範圍了,後面檢測循環條件的時候發現當第五個元素在於第七個元素比較的時候,數組為0-6,沒有7則會報錯,稍改一下條件就解決了圖技術分享圖片

  • 問題2:在做pp9.2的時候出現了輸出地址的情況圖技術分享圖片

  • 解決:經過檢查發現是使用sout的時候帶入的變量錯了多加一個S就出問題了。圖
    技術分享圖片

代碼托管

-圖代碼技術分享圖片

上周考試錯題總結

結對及互評

基於評分標準,我給李楠的博客打分:7分。得分情況如下:

正確使用Markdown語法(加1分)

模板中的要素齊全(加1分)

教材學習中的問題和解決過程, (加3分)

代碼調試中的問題和解決過程, 無問題

感想,體會真切的(加1分)

點評認真,能指出博客和代碼中的問題的(加1分)

點評過的同學博客和代碼

  • 本周結對學習情況
    • 20172330李楠
    • 結對照片
    • 結對學習內容
      • 查找
      • 排序

其他(感悟、思考等,可選)

思路很清晰,寫起來就難受。

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一周 0/0 1/1 10/10
第二周 0/0 1/2 10/20
第三周 1500/1500 1/3 10/30
第四周 2761/4261 2/5 25/55
第五周 814/5075 1/6 15/70
  • 《Java程序設計與數據結構教程(第二版)》

  • 《Java程序設計與數據結構教程(第二版)》學習指導
  • 圖文解釋快速排序法
  • 基數排序法清楚解釋

20172333 2018-2019-1 《程序設計與數據結構》第五周學習總結