計數排序假設n個輸入元素中的每乙個都是介於0到k之間的整數,此處k為某個整數。當k=o(n)時,計數排序的執行時間為 θ(n)。
計數排序是穩定的。
void countingsort(int a,int b,int n,int k)
for (int j=1;j<=n;j++)
for (int i=1;i<=k;i++)
for (int j=n;j>=1;j--)
}
8.2-1 說明counting-sort在陣列 a = <6,0,2,0,1,3,4,6,1,3,2> 上的處理過程。
c = <2,2,2,2,1,0,2>
c = <2,4,6,8,9,9,11>
c[i]表示最後乙個值為i的元素應在的位置。
倒序將a[i]中的元素複製到b[i]中的目標位置。
8.2-2 證明 counting-sort 是穩定的。
對最後的一次迴圈應用迴圈不變式證明b陣列是穩定的。
初始化:在第一次迭代前,b中沒有元素,是穩定的。
保持:某次迭代中,c[i]陣列中,儲存的是a中小於等於i的數有多少個。
即表示小於等於a[j]的最後乙個元素,應在的位置,將a[j]放入b中後,c[a[j]]--。
此時,之後的值為a[j]的元素數減去一。所以j之前的與j相同的數不會放到a[j]之後,因此a[j..n]仍是穩定的。
終止:最後一次迭代後,所有元素都複製到了b中,因此b[1..n]是穩定的。
8.2-3 在 counting-sort 過程中,假設最後一次迴圈的fao首部改為 for j <- 1 to length[a],證明該演算法仍能正常工作。修改後的演算法是穩定的嗎?
在每次迴圈中a[j]被放到小於等於a[j]的最後乙個元素所在的位置,而a[j]不一定是最後乙個小於等於a[j]的元素,但一定等於a[j]。
因此該演算法仍能正常工作,卻不再穩定。
8.2-4 請給出乙個演算法,使之對於給定的介於0到k之間的n個整數進行預處理,並能在o(1)時間內,回答出輸入的整數中有多少個落在區間[a..b]內。你給出的演算法的預處理的時間應該是θ(n+k)。
void prepare(int a,int c,int n,int k)
for (int j=1;j<=n;j++)
for (int i=1;i<=k;i++)
}int getans(int c,int l,int r)
查詢時應保證0<=l<=r<=k。
演算法導論 第8章 線性時間排序 計數排序
計數排序 n個元素都是0到k範圍得整數,當k o n 時,排序執行時間為o n 思想 對於數x,確定小於x的個數m,將x放在第m 1個位置上 例子 假設3個元素小於x,那麼x應該放在4上 輸入第一行的第乙個數n是陣列的個數,第一行第二個數表示所有n的元素中最大的數k 接下來的第二行就是n個數字 輸入...
《演算法導論》第8章 線性時間排序 1 計數排序
一種簡單的實現是得到陣列c,c i 表示陣列a中值為i的元素個數。c 就表示兩個0,兩個2,三個3,乙個5。然後將這些數字依次存到陣列b中。include include void printarray int,int void counting sort int a,int b,int len,i...
演算法導論,習題8 2,計數排序原址排序
計數排序 n 表示 n個數 k 表示n個數的最大值為k 1 書上用偽 呈現的計數排序是穩定的,但是需要兩個輔助陣列,乙個是n大小,乙個k大小,習題8 2的e小題需要寫出只用乙個k大小的輔助陣列就可以的計數排序,本以為很簡單,結果想了很久沒想出來,最後還是看了網上的 真是羞愧,下面是 include ...