排序演算法相關的筆試面試高頻題

2021-08-02 22:46:43 字數 2834 閱讀 1431

1. 荷蘭國旗問題。只包含0,1,2的整數陣列進行排序,要求使用交換、原地排序,不是利用計數進行排序。

原地排序就是指不申請多餘的空間來進行的排序,就是在原來的排序資料中比較和交換的排序。例如

堆排序等都是原地排序,

合併排序

(根據taocp,合併排序也有原地排序的版本),

計數排序

等不是原地排序。

屬於原地排序的是:

希爾排序

、氣泡排序

、插入排序

、選擇排序

、堆排序、快速排序。

本題主要過程與快速排序劃分過程類似;可以做到時間複雜度為o(n),空間複雜度為o(1)。

最左邊開闢乙個長度為0的「0「區域,最右邊開闢乙個長度為0 的「2「區域,然後從左到右遍歷陣列,直到當前遍歷的值已經位於「2」陣列中,則演算法停止!!

class threecolor else if(a[cur]==2)

}return a;}};

對於上面的程式來說,一定更要注意cur right left的加與減,

2, 給定乙個二維陣列,在二維陣列中,每一行每一列都是排好序的,再給定乙個數,判斷在二維陣列中是否包含這個數。

如果二維陣列為m*n,那麼這道題的最優解的時間複雜度可以做到o(m+n)。額外空間複雜度為o(1).

這種題不管是從大到小排還是從小到大排,都應該從右上角或者左下角開始著手,因為這兩個角上的資料,它的兩個相鄰的方向的順序是不同的。比如對於下面的例子來說:

0 1 2 5

2 3 4 7

4 4 4 8

5 7 7 9

對於上面的陣列來說,每一行每一列都是從小到大排序的。對於右上角的5來說,它的左邊逗比它小,它的下面都比它大,是兩個相反的方向,所以可以從它開始著手;

對於左下角的5來說道理也是一樣的,它的上面和它的右邊的大小也正好的相反的;但是對於左上角和右下角就不是這樣了,所以這兩個角不可以作為著手點!!!

9 7 7 5

8 4 4 4

7 4 3 2

5 2 1 0

對於上面的陣列來說,每一行每一列都是從大到小排序的。同理,對於右上角的5來說,它的左邊都比它大,它的下面都比它小,是兩個相反的方向,所以可以從它開始著手;

對於左下角的5來說道理也是一樣的,它的上面和它的右邊的大小也正好的相反的;但是對於左上角和右下角就不是這樣了,所以這兩個角不可以作為著手點!!!

class finder

else if(mat[i][j]具體的程式如上面所示!

3. 給定給乙個陣列,返回陣列中需要排序的最短子陣列的長度。

[1 5 4 3 2 6 7]返回的是4,因為只有[5 4 3 2]需要排序。

這道題的最優解可以做到時間複雜度為o(n),額外空間複雜度為o(1).

從左向右遍歷陣列,用乙個變數記錄遍歷過的最大值,當遍歷過的最大值大於當前數的時候,我們知道這個最大值在排序之後至少在當前數的位置或者更右的位置,最後只記錄發生這種情況的最右的位置;下再從右向左遍歷陣列,用乙個變數記錄遍歷過的最小值,當遍歷過的最小值小於當前數的時候,我們知道這個最小值在排序之後至少在當前數的位置或者更左的位置,最後只記錄發生之中情況的最左的位置!!!

最後最左的位置和右的位置中間的範圍(包括最左和最右)就是要排序的最短陣列。

class subsequence

}if(right==0&&left==0)

else}};

具體的實現如上所示!

4. 給定乙個無序的整形陣列arr,返回如果排序之後,相鄰兩數的最大差值。

最優解的時間複雜度為o(n),額外空間複雜度為(o(n))。

思想來自於桶排序,並且和數值具體的範圍無關。

(主要是想在不進行排序的情況下,找出這個最大差值。)

首先找到陣列中的最小值和最大值,等量的將最小值和最大值之間分成n個區間,這個n就是陣列中資料的數量。每個區間分別對應乙個桶,將最大值放到第n+1號桶中,因為桶的數量為n+1個,資料一共n個,所以中間一定有空桶。我們知道同乙個桶中資料的差值不會大於桶區間,而來自空桶兩側的桶中的資料的差值一定大於桶區間。需要注意的是每個區間的取值範圍是[ )這種形式的,因此最大值才需要單獨放到乙個桶。

不用考慮同乙個桶的相鄰數,只用考慮桶間的相鄰數。並且只需要記錄用後乙個桶的最小值減去前乙個桶的最大值中得到的最大值就是最後相鄰兩數的最大差值。

class gap

//一共有n+1個桶,最後乙個桶放最大值

int interval = max - min; //必須用double型別,如果用整形,區間的計算長度經常都是分數,就會失真!!!

//可以申請兩個陣列,長度都是n,乙個存放每個桶中的最大值,乙個存放每個桶中的最小值

//int interval=(max-min)/n;一開始本來想直接計算出區間的,但是區間通常都是分數,如果變成int型別就會失真,導致後面的結果發生錯誤!!!

vectormaxbucket (n + 1, int_min);

vectorminbucket (n + 1, int_max);

int index;

for (int i = 0; i < n; i++)

int result = 0;

int pre = maxbucket[0]; //需要注意的是0桶裡一定至少有乙個值,就是整個陣列中的最小值

for (int j = 1; j < n+1; j++)//這裡一定是n+1!!!!!!因為是n+1個桶啊啊啊啊啊!!!!!!

}return result;}};

對於上面的程式來說,一定要時刻謹記,maxbucket以及minbucket的大小都是n+1!!!!這個很重要,如果弄錯容易造成陣列越界以及結果的錯誤!!!!並且在計算index 的時候一定要記住要保證區間為分數時不能約為小數,這樣會造成陣列越界等錯誤!!!!!

排序演算法相關

1.1氣泡排序 氣泡排序的基本原理是 依次比較相鄰的兩個數,將大數放在前面,小數放在後面,也即首先比較第乙個和第二個數,將大數放在前面,小數放在後面。然後比較第2個數和第3個數,將大數放前,小數方後,依次直至比較最後兩個數。如此在第一輪最後的數必定是所有數中最小的,然後重複以上過程將所有小數放在最後...

面試高頻leetcode演算法題

持續更新 def quick rank nums if len nums 1 return nums left,right mid nums 0 for i in nums 1 if i mid else return quick rank left mid quick rank right 給定乙...

面試總結 演算法相關

設定雙指標,間距為k,順序後移,當right至末尾,left指向倒數第k個元素。使用快慢指標的方法,一定步數後,兩個指標會相遇。思路,建乙個棧存放單鏈表的偶數字。採用歸併方法,合併兩個有序集合。棧 單鏈表奇數字 設定兩個陣列,第乙個陣列a1放置26個字母。a1 a b z 第二個陣列a2放置a1的個...