對乙個陣列按照給定的下標進行排序,僅僅使用兩兩交換的方式,要求不能對陣列進行擴容,盡可能少的額外空間。這是最近看到的一道面試題,感覺突然一下不容易想到,所以特此來寫一下:如:原陣列為a,b,c,d,e,現在給定的新位置為3,0,1,4,2,那麼排序後為d,a,b,e,c,
void swapsort(int *parr,int *ppos,int n)
實現**:
void swapsort(int *parr, int *ppos, int n)
}
}else}}
當我寫完這種方式的時候,我進行了其他案例的測試
比如我給出了ppos=,或者是ppos=。
最後在這裡我總結出乙個特點,就是這個時候如果我們按照上述那樣操作的話,最終會出現一種問題,只能調整乙個範圍內的資料成正常順序,另外乙個不相關的範圍的順序就會出問題了。
首先我想到的是採用乙個陣列記錄所有的狀態,每把乙個放到正常位置以後就把輔助陣列當中的狀態改為1,否則就為0,但是,這樣,空間複雜度就變為了o(n),所以我們想到下一種辦法
//當全部填充後,可以考慮跳出
if (i >= n)
break;
if (ppos[i] != i)
}} }}
對於面試題中好多東西我們是都可能沒見過的,但是在這個其中,大部分都是我們見過的一些的變形,所以需要熟練的使用我們所學習的資料結構和演算法,當然,前提是對這些結構和演算法的概念一定要清楚的記得。
python挖坑法實現快排
快速排序 快速排序就是快 排序思路 python 示例 lst 5,7,4,3,1,2,9,8 defquick sort data,left,right if left mid partition data,left,right quick sort data,left,mid 1 quick s...
各種面試題 鍊錶快排
前面寫了個鍊錶的歸併排序,這裡再寫個鍊錶的快排。鍊錶的快排處理其實跟陣列的沒什麼區別,只是在partition要三位取中的話稍微煩一點 include include includeusing namespace std struct listnode typedef listnode ln ln ...
快排的非遞迴實現(騰訊面試題)
leader面問了乙個快排的非遞迴實現,一下子蒙了。因為平常從來都是遞迴的快排,當時只想到遞迴變非遞迴肯定要用到棧,但怎麼也想不出來,今天來補一下。先把遞迴的寫一下吧 int partition vector int nums,int left,int right while left right ...