8.2-1
注:在排序第一次和最后一次的表格中,第二行表示存放的位置。
8.2-2
排序前两个相等是数的下标
i1<i2
,排序后它们的下标为
j1+1=j2
。由于是从后向前扫描数组,所以先放
A[i2]
到
B[j2]
,再放
A[i1]
到
B[j1]
。它们顺序并没有改变,因此是稳定的。
8.2-3
结果还是正确的但是不稳定。它会把相对顺序反过来。证明类似于 8.2-2,在此略。
8.2-4
利用计数排序得到的数组 C,然后取
C[b]−C[a−1]
(C[−1]=0)
即可。
附上计数排序代码
#include <iostream>
#include <cstring>
using std::cout;
using std::endl;
void COUNTING_SORT(int *array,int length,int max_int_k)
{
int *C = new int[max_int_k+1];
memset(C,0,sizeof(int)*(max_int_k+1));
for(int i = 0; i < length; ++i)
++C[array[i]];
for(int i = 1; i < max_int_k + 1; ++i)
C[i] += C[i-1];
int *temp = new int[length];
for(int i = length - 1; i >= 0; --i)
temp[--C[array[i]]] = array[i];
for(int i = 0; i < length; ++i)
array[i] = temp[i];
delete []C;
delete []temp;
}
int main()
{
int ia[] = {6,0,2,0,1,3,4,6,1,3,2};
COUNTING_SORT(ia,11,6);
for(int i = 0; i < 11; ++i)
cout << ia[i] << ' ';
cout << endl;
return 0;
}