Java實現面試六個演算法

2021-08-04 14:12:32 字數 2387 閱讀 8658

查詢演算法

典型的二分查詢

對於二分查詢演算法要求, 查詢前的資料必須是已經排好序的, 然後得到陣列的開始位置start和結束位置end, 取中間位置mid的資料a[mid]跟待查詢資料key進行比較, 若 a[mid] > key, 則取end = mid - 1; 若 a[mid] < key, 則取start = mid + 1; 若 a[mid] = key 則直接返回當前mid為查詢到的位置. 依次遍歷直到找到資料或者最終沒有該條資料. 囉嗦這麼多, 上**!!!

//已經排好序的陣列public static int binarysearch(int nums, int key) else if (nums[mid] > key) else if (nums[mid] < key)

}return -1;

}排序演算法

排序演算法可以說是老生常談的問題, 下面的**思路是根據 嚴蔚敏的《資料結構》而來.

務必注意: 以下所有的排序演算法都是從1開始, 而不是從0開始, 有的排序演算法會把0位置當作監視哨

今天就介紹一下幾種常見的排序演算法:

排序之前先寫乙個交換方法後面會用到

//交換

private static void swap(int a, int i, int j)

插入排序

插入排序的基本思想是,經過i-1遍處理後,l[1..i-1]己排好序。第i遍處理僅將l[i]插入l[1..i-1]的適當位置,使得l[1..i] 又是排好序的序列。要達到這個目的,我們可以用順序比較的方法。首先比較l[i]和l[i-1],如果l[i-1]≤ l[i],則l[1..i]已排好序,第i遍處理就結束了;否則交換l[i]與l[i-1]的位置,繼續比較l[i-1]和l[i-2],直到找到某乙個位置j(1≤j≤i-1),使得l[j] ≤l[j+1]時為止。圖1演示了對4個元素進行插入排序的過程,共需要(a),(b),(c)三次插入

穩定,時間複雜度 o(n^2)

//插入排序public static void insertsort(int a)

a[j + 1] = a[0];}}

}選擇排序

選擇排序的基本思想是對待排序的記錄序列進行n-1遍的處理,第i遍處理是將l[i..n]中最小者與l[i]交換位置。這樣,經過i遍處理之後,前i個記錄的位置已經是正確的了。

不穩定, 時間複雜度 o(n^2)

//選擇排序

public static void selectsort(int a) }}

// 查詢從i開始到a.length中最小的位置

private static int selectminkey(int a, int i)

}return key;

}氣泡排序

氣泡排序方法是最簡單的排序方法。這種方法的基本思想是,將待排序的元素看作是豎著排列的「氣泡」,較小的元素比較輕,從而要往上浮。在氣泡排序演算法中我們要對這個「氣泡」序列處理若干遍。所謂一遍處理,就是自底向上檢查一遍這個序列,並時刻注意兩個相鄰的元素的順序是否正確。如果發現兩個相鄰元素的順序不對,即「輕」的元素在下面,就交換它們的位置。顯然,處理一遍之後,「最輕」的元素就浮到了最高位置;處理二遍之後,「次輕」的元素就浮到了次高位置。在作第二遍處理時,由於最高位置上的元素已是「最輕」元素,所以不必檢查。一般地,第i遍處理時,不必檢查第i高位置以上的元素,因為經過前面i-1遍的處理,它們已正確地排好序。

穩定,時間複雜度 o(n^2)

//氣泡排序

public static void bubblesort(int a) }}

}快速排序

不穩定,時間複雜度 最理想 o(nlogn) 最差時間o(n^2)

快速排序是對氣泡排序的一種本質改進。它的基本思想是通過一趟掃瞄後,使得排序序列的長度能大幅度地減少。在氣泡排序中,一次掃瞄只能確保最大數值的數移到正確位置,而待排序序列的長度可能只減少1。快速排序通過一趟掃瞄,就能確保某個數(以它為基準點吧)的左邊各數都比它小,右邊各數都比它大。然後又用同樣的方法處理它左右兩邊的數,直到基準點的左右只有乙個元素為止。

//快速排序

public static void quicksort(int a, int low, int high)

}//獲取到a的下標 low ~ high 中, a[low]的應該放的位置, 即左邊的數 < a[low] 右邊的數 > a[low]

private static int partitionloc(int a, int low, int high)

a[low] = a[high];

while (low < high && a[low] <= a[0])

a[high] = a[low];

}a[low] = a[0];

return low;

}note: 在這裡就屬快速排序稍微有些複雜, 但是這也是常考乙個演算法, 仔細看**中的注釋應該能明白, 一起加油.

六個排序演算法

直接插入法 官方解釋 直接插入位置的確定方法是將待插入的記錄與有序區中的各記錄自右向左一次比較其關鍵字值得大小 自我理解 直接排序法原理是通過監視哨與前乙個對比如果前一位的資料大於監視哨的資料 資料進行右移 演算法最大趟數45 n n 1 2 adjfkalsf直接插入排序法 通過arr 0 進行監...

面試有戲的六個訊號

曾投票評選出了五大面試失敗訊號,失敗級別從高到低,依次為 面試結束後一周沒通知 五分鐘了結的面試 面試官貶低自己公司 被面試官找茬,百般刁難 面試官完全不聊工作 光知道失敗訊號還不夠,我們也該了解一下預示面試有戲的訊號,以便在求職時為下一步的發展做好更充分的準備,希望你在看完之後對面試結果更加有底。...

程式設計六個原則

程式設計6大設計原則和23種設計模式,其中6大設計原則如下 1 單一職責原則 不同的類具備不同的職責,各司其職。做系統設計時,如果發現有乙個類擁有了兩種職責,那麼需要考慮可以將這個類分成兩個類嗎?如果真的有必要,那就分開,千萬不要讓乙個類幹的事情太多。ps 乙個類只承擔乙個職責,邏輯解耦,是程式邏輯...