演算法筆記2 排序

2021-09-09 07:11:50 字數 2991 閱讀 5825

1.選擇排序:

首先,找到陣列中最小的那個元素,其次,將他和陣列第乙個元素交換位置,

再次,在剩下的元素中找到最小的元素,將他和陣列的第二個元素交換位置。

如此反覆,直到將整個陣列排序。不斷的選擇剩餘元素的最小值

2.插入排序:(對部分有序陣列很有效)

為了給要插入的元素騰出空間,我們需要將其餘所有元素在插入之前都向右移動一位。

自底向上的歸併排序:先歸併那些微型陣列,然後再成對歸併得到子陣列,如此這般,知道整個陣列歸併到一起。

首先進行的是兩兩的歸併(把每個元素想象成乙個大小為1的陣列),然後是四四歸併(把兩個大小為2的陣列歸併為大小為4的陣列),然後一直下去。。。

在每一輪歸併中,最後一次歸併的第二個陣列可能比第乙個子陣列要小,如果不是的話所有歸併的中兩個陣列的大小都應該一樣。而下一輪會翻倍。

自底向上的歸併排序會多次遍歷整個陣列,根據子陣列大小進行兩兩歸併。子陣列的大小sz的初始值為1,每次加倍。最後乙個子陣列的大小只有在陣列是sz的偶數倍的時候才會等於sz(否則它會比sz小)。

public class mergebu

public static void sort(comparablea,int lo,int hi)

}

快速排序遞迴的將子陣列a[lo...hi]排序,先用partition()方法將a[j]放到乙個合適的位置,然後再用遞迴呼叫將其他位置的元素排序。

切分:對於某個j,a[j]已經排定;

a[lo]到a[j-1]中的所有元素都不大於a[j];

a[j+1]到a[hi]中的所有元素都不小於a[j]。

要完成這個實現,需要實現切分方法。一般策略是先隨意取a[lo]作為切分元素,既那個將會被排定的元素,然後我們從陣列的左端開始向右掃瞄直到找到乙個大於等於它的元素,再從陣列的右端向左掃瞄直到找到乙個小於等於它的元素。這兩個元素顯然是沒有排定的,交換他們的位置。如此繼續,我們可以保證左指標i左側元素都不大於切分元素,右指標j的右側元素都不小於切分元素。當兩個指標相遇時,我們只需要將切分元素a[lo]和左子陣列最右側的元素(a[j])交換然後返回j即可。

private static int partition(comparablea,int lo,int hi)

int temp=a[lo]; //將v=a[lo]放到正確的位置上

a[lo]=a[j];

a[j]=temp;

return j; //返回位置角標

}

這段**我們按照a[lo]的值切分。當指標i和j相遇時主迴圈退出。在迴圈中,a[i]小於v時我們增大i,a[j]大於v時我們減小j,然後交換a[i]和a[j]來保證i左側的元素都不大於v,j右側的元素都不小於v。當指標相遇時交換a[lo]和a[j],切分結束。

是一種抽象的資料型別,最重要的操作就是刪除最大元素和插入元素。

堆:二叉堆的陣列中,每個元素都要的大於等於另外兩個特定的元素。

堆有序:乙個二叉樹的節點都大於等於它的兩個子節點

完全二叉樹:只用陣列不用指標,具體方法是將二叉樹的節點按層級順序放入到陣列中。

在乙個堆中,位置k節點的父節點的位置是k/2,而它的兩個子節點的位置則分別是2k和2k+1.

優先佇列的實現:用長度為n+1的私有陣列pq來表示乙個大小為n的堆,我們不使用pq[0],堆元素放在pq[1]到pq[n]中。

右下至上的堆的有序化(上浮):如果堆的有序狀態因為某個節點變得比它的父節點大而被打破,那麼就需要交換它和它的父節點來修復堆。

private void swim(int k)

}

由上至下的堆有序化(下沉):如果堆的有序狀態因為某個節點變得比它的兩個子節點小而被打破,那麼就需要交換它和它的兩個子節點中較大者來修復堆。

private void sink(int k)

public boolean isempty()

public int size()

public void insert(key v)

/*從陣列頂端刪除最大元素並將陣列的最後乙個元素放到頂端,減小堆的大小並讓這個元素下沉到合適的位置

*/ public key delmax()

private boolean less (int i,int j)

private void exch(int i,int j)

private void swim(int k) }

private void sink(int k)

//下沉排序階段,將最大值a[1]和a[n]交換並修復堆,

//每次將最大元素刪除,然後放入到陣列減小空出的位置。

2 排序演算法 快速排序

問題描述 利用快速排序演算法對下列例項排序,在演算法執行過程中,寫出陣列 a第一次排序後被分割的過程。a 65,70,75,80,85,55,50,2 解題思想 在快速排序中,記錄的比較和交換是從兩端向中間進行的,關鍵字較大的記錄一次就能交換到後面的單元,總的比較和移動次數較少。對於輸入的陣列a p...

2 排序演算法 氣泡排序

氣泡排序 bubble sort 也是一種簡單直觀的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢 浮 到數列的頂端。作為最簡單...

演算法 2 排序1 0

對於排序演算法執行效率的分析,我們一般會從這幾個方面來衡量 1.最好情況 最壞情況 平均情況時間複雜度 我們在分析排序演算法的時間複雜度時,要分別給出最好情況 最壞情況 平均情況下的時間複雜度。2.時間複雜度的係數 常數 低階 我們知道,時間複雜度反應的是資料規模n很大的時候的乙個增長趨勢,所以它表...