秋招準備 演算法 排序(總)

2021-08-17 18:03:57 字數 2661 閱讀 3179

1.

ques:簡單介紹選擇排序

選擇排序通過在每一輪迴圈中選擇出極值,然後將之與未排序好區域的某個端點作交換,完成一次排序。

比如,第一輪選出最小值,此時的未排序區是0~n-1,則將這個最小值與0號陣列元素作交換,完成排序,以此類推,外迴圈n次之後完成排序。

中間變數:儲存每次排序最小值的temp,最小值的索引index。

2.ques:簡單介紹插入排序

對給定的一組記錄,初始時設定第乙個記錄為已排序序列,其餘記錄為無序序列,然後從第二個記錄開始,依次插入到有序序列的相應位置。當最後乙個無序序列插入完成時,完成排序。

比較發生在待插入元素判斷自己的位置時與已排序序列的元素之間的比較。

3.ques:簡單介紹氣泡排序

氣泡排序的特點是元素往上公升,表現在演算法上,則是在第k次迴圈時,將還未排好序的元素從左到右開始兩兩比較,保證兩者間大的在右邊,若是大的在右邊則進行一次交換,這樣當未排序的元素都完成比較之後,未排序的元素裡的最大值就已經上公升到最右邊了,這個最大值就完成了排序,隨後對剩下的元素重複操作,直到記錄只剩乙個為止。

4.ques:簡單介紹歸併排序

用到遞迴與分治,將序列劃分成為越來越小的半子表,再對半子表排序,最後將拍好序的半子表合併成越來越大的有序序列。

模擬對話:

我一般介紹歸併排序,還會附上乙個例子,因為歸併的思想說起來很簡單,就是將之不斷二分成小的子表,然後對子表排序,再進行合併,這樣其實很抽象。在具體實現上其實才更能體現遞迴與分支的思想。

比如,有1~8個元素,那麼我們從遞迴的底層說起,將他們不斷二分之後,會變成1,2,3,……8個單獨的序列,這序列是定義在我們心裡的,實際上他們仍然還是在陣列裡一動不動,那麼是怎麼把這個抽象出來的子串行合併的呢,操作起來是,將1與2號元素額外開闢兩個陣列儲存,將這兩個陣列看成子串行,然後對這兩個子串行進行二路歸併,排序到真實陣列的1,2號位上。

那麼3,4號,5,6號元素,7,8號元素也是同樣的道理,這樣就完成了最底層的子表的排序,再上一層的子串行,就變成了1,2。3,4……並且,這四個子表的序列都是經過二路歸併是有序的,接下來就是對這四個子表,兩兩進行二路歸併,最後變成兩個有序子表,再經過一次二路歸併,就得到了結果。

這是底層遞迴回來的過程,那麼遞迴函式的寫法就是先分後合,分是遞迴呼叫自身,合是另寫乙個函式,用以將子串行合併,具體實現中,只要明白乙個中間量其實就很容易了,那個中間量,就是分合子表時,給的首尾序號的平均值,從首序號到這個中間量,就是劃分的左子表,中間量到尾序號則是劃分的右子表,在二路歸併確定是哪兩個陣列歸併時,用得就是這兩個子表,這就完成了抽象的分與合的過程。

現場實現:

⑴.記住遞迴的結構

public void mergesort(int arr,int start,int end)

5.ques:簡單介紹快速排序

快排採用分治,我的理解是,在找到乙個標桿值,這個標桿值滿足的條件是,在它左邊的值全部比它小,在它右邊的值全部比它大,找到這個值後,再對兩邊的部分繼續進行上述操作。

因為這個標桿值其實就是排好序後,該元素所在的位置,所以確定標桿值就是確定元素位置,而不斷分解到小的子表後,當只有兩個元素時,確定好乙個值的位置,也就完成了這兩個元素的排序,這樣,實際上是對所有區間都求好了標桿值,因此完成排序。

重點:如何找到標桿值

一般是把第乙個記錄當做標值,然後找它的位置,先用index記錄下這個值,然後開始查詢。

令j=end。從右邊開始找,有a[j]小於index的話,交換a[i],a[j]。此時標值移到a[j],a[i]已在指定區,i++;

然後從i開始,從左往右找,有a[i]大於index的話,交換a[i],a[j]。此時標值又回到a[i],a[j]在指定區,j--;

重複上述操作,並且一直要保證i當i=j的時候,此時的a[i]或說a[j]就是標值,並且已經在中間位置了。

實現:單向交換實現

public static void sort(int arr,int start,int end)

雙向交換實現,不過要注意一些細節

public static void sort(int arr,int start,int end)

6.ques:簡單介紹希爾排序

希爾排序又稱縮小增量排序,是插排的一種,原理是先將待排序的陣列元素分成多個子串行,可以將這些子串行理解為序號成公差不同的等差數列,然後對這些序列完成插入排序,再縮小公差重複操作,直到最後公差為1,實際上就是再進行插入排序,但此時元素已經基本有序,因為在公差很大的情況下,通過跳躍式的移動,使得比較與交換的次數減少了很多,所以可以實現效率的提公升。

實現:把握好三層迴圈的初始h,i,j到底是什麼意思,可以簡單的實現。

h是公差,可以取length/2直到1.也可以自己指定,最後有個1就行。

h一定的情況下,0~h-1分別是這些數列的第乙個元素,那麼h~len-1就是可以並且需要插入到相應數列裡的元素,i負責遍歷它們   

a[i]是需要插入到相應陣列的元素,那麼j負責將之與其對應的數列比較,執行插入操作,a[i]所在的陣列序列應該為i,i-h,i-2h……

public static void shellsort(int arr)

arr[j+h]=temp;

}} }

7.ques:簡單介紹堆排序

秋招準備之rabbitmq

mq三大好處 rabbitmq,訊息是存放在queue中。訊息確認。如果在消費者執行過程當初出現了意外 宕機 rabbitmq沒有收到訊息回執,就會傳送給其他消費者執行。rabbitmq服務重啟的情況下,也不會丟失訊息,我們可以將queue與message都設定為可持久化的 durable 分發機制...

秋招準備100天 10

設計模式 命令模式本來可以將命令作為乙個抽象類,每個命令寫成乙個具體類,然後客戶端直接呼叫具體命令類。對於命令模式,大家可能 心存疑慮,明明是乙個很簡單的呼叫邏輯,為什麼要做如此的複雜,為什麼不直接reciver的excute方法就可以實現功能?呼叫邏輯複雜,是為了如果後續命令的增加,能夠應對後續需...

2023年秋招演算法崗需要準備什麼?

找工作準備過程中,收集了一些個人覺得對演算法崗有用的資料,以我的水平也很難評定出哪些資料的含金量高,稍微有些參考意義就都收藏了。cv公司 按城市分類 amusi cv company list ai求職攻略 amusi ai job notes 深度學習面試寶典 amusi deep learnin...