每天一道演算法題 時間複雜度為O n 的排序

2022-05-26 06:06:06 字數 1142 閱讀 7315

有1,2,……一直到n的無序陣列,求排序演算法,並且要求時間複雜度為o(n),空間複雜度為o(1),使用交換,而且一次只能交換兩個數。

這個是以前看到的演算法題,題目不難。但是要求比較多,排序演算法中,時間複雜度為o(n)就是基數排序了。

現在介紹兩種解法:

解法一:用陣列特性——下標實現交換

掃瞄陣列,每次arr[i],arr[arr[i]-1]交換,如果arr[i]=i+1,則什麼都不做。這樣交換一次保證乙個數字被放到它應該被放置的位置上。最後陣列有序。

#include #include 

using

namespace

std;

void swap(int& a, int&b)

vector

& sort(vector&vec1)

return

vec1;

}int

main();

vector

vec2(arr,arr+9

); sort(vec2);

for(int i=0;i)

cout

<"";

return0;

}

上面的題目是每個數字只出現一次,如果不限制出現的次數,要求時間複雜度是o(n),空間複雜度為o(1)又該怎麼做,給出數字的最大範圍假設為65536。

這個題用桶排序應該可以做。

解法二:利用count[65536](和n無關,空間複雜度為o(1))陣列記錄出現的次數

那麼假設有下面這些數字:

100200

30011906

...那麼對於每個這個數字,都做在count中記錄一下:

100 => count[100]++

200 => count[200]++

300 => count[300]++

119 => count[119]++

0 => count[0]++

6 => count[6]++

最後,遍歷一邊所有這些數字就可得到0~65535每個數字的個數(在count陣列中),然後再順序遍歷count陣列,count[n] = m,則輸出m個n,(比如說有count[3] = 2, 那麼說明有2個數字3),依次輸出,最後可得結果。

每天一道演算法題

no.1 棧是特殊的線性表,它。a.對 b.錯答案 錯,它的插入和刪除都是在同一端進行的。no.2 n個葉子節點的滿二叉樹 除了葉子節點,每個節點都有兩個孩子 總共有多少個節點?a.2n 1 b.2n c.n 1 d.n答案 a 滿二叉樹我們講過了,度為0的節點比度為2的加點多乙個。滿二叉樹是特殊的...

每天一道演算法題

1.給定乙個只包括 的字串,判斷字串是否匹配。有效字串需滿足 左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。注意空字串可被認為是有效字串。思路 正確思路 不需要考慮輸入內容是否合法,這只是做題,不是工程 定義乙個字典,後括號為鍵,前半部分為值 定義乙個元素儲存棧頂,注意這個設定,取棧...

每天一道演算法題

1 js計算某個字串出現的次數 j ascript計算乙個字串最多重複的字元及出現次數.var str zhaochucichuzuiduodezifu var o for var i 0,length str.length i length i else console.log o 輸出的是完整的...