算法講解--選擇排序、數組鏈表

算法講解--選擇排序、數組鏈表


本文是對《算法圖解》的第二章的學習的筆記。歡迎多多指正。

數組和鏈表

數組:
   
使用數組存儲item意味着所有item在內存中都是相連的。在數組中存儲新的item可能很麻煩,because if 沒有了新空間,就得移動到內存的其他地方,因此添加新元素會很慢。數組刪除元素也很麻煩,刪除元素後,必須將後面的元素前移。
結決辦法1 :預留空間。
缺點:
1、額外請求的位置可能用不上。這將會浪費內存。【佔着**不拉*】相信你能猜測到啥意思 xixi
2、if 預留空間還不夠,還是得轉移。
結決辦法2 :使用鏈表

鏈表:
   
鏈表中的元素可存儲在內存中的任何地方。鏈表中的每個元素都存儲了下一個元素的地址,從而使一系列隨機內存地址串在一起。 使用鏈表添加元素很容易,只需將其放入內存,並將地址存儲到前一個元素中就ok了,注意:使用鏈表不需要移動元素。刪除操作:鏈表也是更好的選擇,because 刪除元素只需修改前一個元素指向的地址即可。

總結:
   
       數組讀取的運行時間 O(1) 插入O(n) 刪除 O(n)
       鏈表讀取的運行時間 O(n) 插入O(1) 刪除 O(1)
注意下哈。。。 再同一個數組中,所有元素的類型都必須相同(都爲int 、double等) 弊端 引出集合

選擇排序

example: 找出播放次數組多的樂隊,必須檢查列表中的每個元素。需要的時間O(n),對於這種O(n)的操作,需要執行n次。需要的總時間即 O(n2)

下面展示一些 內聯代碼片

   public int[] sort(int[] sourceArray) {
        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);

        // 總共要經過 N-1 輪比較,每一次找到最小的索引值
        for (int i = 0; i < arr.length - 1; i++) {
            int min = i;

            // 每輪需要比較的次數 N-i
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[j] < arr[min]) {
                    // 記錄目前能找到的最小值元素的下標
                    min = j;
                }
            }

            // 將找到的最小值和i位置所在的值進行交換
            if (i != min) {
                int tmp = arr[i];
                arr[i] = arr[min];
                arr[min] = tmp;
            }

        }
        return arr;
   }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章