數據結構與算法簡述(下)

目錄:

  • 算法簡介
  • 排序算法
  • 遞歸與窮舉
  • 貪心與分治
  • 動態規劃和回溯

1.算法簡介

解題方案的準確而完整的描述,是一系列解決問題的清晰指令。

特征

  • 有窮性
  • 確切性
  • 輸入項
  • 輸出項
  • 可行性

算法優劣評定

  • 時間復雜度
  • 空間復雜度
  • 正確性
  • 可讀性
  • 健壯性

2.算法排序

2.1 插入排序
  • 冒泡排序
public static void main(String [] args){
        int[] a = {49,38,65,97,23,22,76,1,5,8,2,0,-1};
        //直接插入排序開始
        for(int i = 1;i<a.length;i++){
            int temp = a[i];//新遍歷的值,等待插入到前面的有序數組
            int j;
            for(j = i-1;j>=0;j--){
                //將大于temp的數往后面移一步
                if(a[j]>temp){
                    a[j+1] = a[j];
                }else{
                    break;
                }
            }
           //break數據代表j處數據小于temp,j之前的數據又是從小到大排列,所以temp就放在j后面
            a[j+1] = temp;
        }
        System.out.println("排序后:");
        for(int i = 0;i<a.length;i++){
            System.out.println(" "+a[i]);
        }
    }

時間復雜度:O(N^2)

  • 二分法排序

時間復雜度:O(logN)

  • 希爾排序

時間復雜度:O(N^(3/2))

2.2 選擇排序
  • 簡單選擇排序

時間復雜度:O(N^(3/2))

  • 堆排序
    //堆排序
    public static void main(String[] args){
        int[] array = {39,44,1,0,8,66,23,67,9,15,100,70,22,3,6,54};
        HeapSort heapSort = new HeapSort();
        heapSort.heapSort(array);
        for(int i = 0;i<array.length;i++){
            System.out.println(" "+array[i]);
        }
    }
    
    public void heapSort(int [] a){
        if(a == null||a.length<=1){
            return;
        }
        //創建大堆
        buildMaxHeap(a);
        for(int i = a.length-1;i>=1;i--){
            //最大元素已經排在了下標為0的地方
            exchangeElements(a, 0, i);//每交換換一次,就沉淀一個大元素
            maxHeap(a, i, 0);
        }
    }

    
    private void buildMaxHeap(int[] a) {
        int half = (a.length -1)/2;//假設長度為9
        for(int i = half;i>=0;i--){
            //只需遍歷43210
            maxHeap(a,a.length,i);
        }
    }

    //length表示用于構造大堆的數組長度元素數量
    private void maxHeap(int[] a, int length, int i) {
        int left = i*2+1;
        int right = i*2+2;
        int largest = i;
        if(left<length&&a[left]>a[i]){
            largest = left;
        }
        if(right<length&&a[right]>a[largest]){
            largest = right;
        }
        if(i!=largest){
            //進行數據交換
            exchangeElements(a,i,largest);
            maxHeap(a, length, largest);
        }
    }

    //在數組a里進行兩個下標元素交換
    private void exchangeElements(int[] a, int i, int largest) {
        int temp = a[i];
        a[i] = a[largest];
        a[largest] = temp;
    }

時間復雜度:O(NlogN)

2.3 交換排序
  • 快速排序
    /**
     * 快速排序
     * 
     * @param a
     * @param i
     * @param j
     */
    private void quickSort(int[] a, int low, int high) {
        if (low < high) {
            int middle = getMiddle(a, low, high);
            quickSort(a, 0, middle - 1);
            quickSort(a, middle + 1, high);
        }
    }

    /**
     * 獲取中間下標
     * 
     * @param a
     * @param low
     * @param high
     * @return
     */
    private int getMiddle(int[] a, int low, int high) {
        int temp = a[low];// 基準元素
        while (low < high) {
            while (low < high && a[high] >= temp) {
                high--;
            }
            a[low] = a[high];
            while (low < high && a[low] <= temp) {
                low++;
            }
            a[high] = a[low];
        }
        a[low] = temp;// 插入到排序后正確的位置
        return low;
    }

    public static void main(String[] args) {
        QuickSort quickSort = new QuickSort();
        int[] a = { 19, 2, 3, 90, 67, 33, -7, 24, 3, 56, 34, 5 };
        quickSort.quickSort(a, 0, a.length - 1);
        for (int num : a) {
            System.out.println(" " + num);
        }
    }

時間復雜度:O(NlogN)

2.4 歸并排序
    //歸并排序
    public void mergeSort(int[] a, int left, int right) {
        if (left < right) {
            int middle = (left + right) / 2;
            mergeSort(a, left, middle);
            mergeSort(a, middle + 1, right);
            merge(a, left, middle, right);// 合并
        }
    }

    private void merge(int[] a, int left, int middle, int right) {
        int[] tmpArray = new int[a.length];
        int rightStart = middle + 1;
        int tmp = left;
        int third = left;
        // 比較兩個小數組相應下標位置的數組大小,小的先放進新數組
        while (left <= middle && rightStart <= right) {
            if (a[left] <= a[rightStart]) {
                tmpArray[third++] = a[left++];
            } else {
                tmpArray[third++] = a[rightStart++];
            }
        }
        // 如果左邊還有數據需要拷貝,把左邊數組剩下的拷貝到新數組
        while (left <= middle) {
            tmpArray[third++] = a[left++];
        }
        // 如果右邊還有數據......
        while (rightStart <= right) {
            tmpArray[third++] = a[rightStart++];
        }
        while (tmp <= right) {
            a[tmp] = tmpArray[tmp++];
        }
    }

    public static void main(String[] args) {
        MergeSort mergeSort = new MergeSort();
        int[] a = new int[] { 90, 3, 2, 67, 44, -9, 87, 65, 11, 9, 2, 8 };
        mergeSort.mergeSort(a, 0, a.length - 1);
        for (int n : a) {
            System.out.print(" " + n);
        }
    }

時間復雜度:O(NlogN)

2.5 基數排序
    public void sort(int[] array) {
        int max = 0;// 獲取最大值
        for (int i = 0; i < array.length; i++) {
            if (max < array[i]) {
                max = array[i];
            }
        }
        int times = 0;// 獲取最大值位數
        while (max > 0) {
            max = max / 10;
            times++;
        }
        List<ArrayList> queue = new ArrayList<ArrayList>();// 多維數組
        for (int i = 0; i < 10; i++) {
            ArrayList<Object> q = new ArrayList<>();
            queue.add(q);
        }
        for (int i = 0; i < times; i++) {
            for (int j = 0; j < array.length; j++) {
                // 獲取對應的位的值(i為0是個位,1是10位,2是百位)
                int x = array[j] % (int) Math.pow(10, i + 1) / (int) Math.pow(10, i);
                ArrayList<Integer> q = queue.get(x);
                q.add(array[j]);// 把元素添加進對應下標數組
                // queue.set(x,q);//待定
            }
            // 開始收集
            int count = 0;
            for (int j = 0; j < 10; j++) {
                while (queue.get(j).size() > 0) {
                    ArrayList<Integer> q = queue.get(j);// 拿到每一個數組
                    array[count] = q.get(0);
                    q.remove(0);
                    count++;
                }
            }
        }
    }

    public static void main(String[] args) {
        BasicSort basicSort = new BasicSort();
        int[] a = { 136, 2, 6, 8, 9, 2, 8, 11, 23, 56, 34, 90, 89, 29, 145, 209, 320, 78, 3 };
        basicSort.sort(a);
        for (int n : a) {
            System.out.print(" " + n);
        }
    }

時間復雜度:O(NlogN)

3.遞歸與窮舉

  • 二分法查找

4.貪心與分治

5.動態規劃和回避

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,030評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,310評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,951評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,796評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,566評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,055評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,142評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,303評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,799評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,683評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,899評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,409評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,135評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,520評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,757評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,528評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,844評論 2 372

推薦閱讀更多精彩內容