总结:
1.下标的思想才是王道。深入理解下标,能力提升一大步。
2.在精不在多。
3.练习才是王道。不断的打代码,才能出真知。
计数排序:
1.思想:
对每一个输入的元素 X ,确定出小于 X 的元素的个数。然后把 X 直接放到它的最终的数组中的位置上。
2.伪代码:
COUNTING-SORT( A, B, k)
for i <---- 0 to k
do C[ i ] <---- 0
for j <---- 1 to length[ A ]
do C[ A [ j ]] <---- C [ A [ j ] ] + 1
::C [ i ] 包含等于 i 的元素的个数
for i <---- 1 to k
do C [ i ] <---- C [ i ] + C [ i - 1 ]
::C [ i ] 包含小于等于 i 的元素的个数
for j <----length[ A ] downto 1
do B[ C [ A [ j ]]] = A [ j ]
C [ A [ j ] ] <---- C [ A [ j ] ] - 1
程序代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 55
void ran(int *a)
{
int i = 0;
for (i = 0; i < N; i++) {
*(a + i) = rand() % 100;
}
}
void pri(int *a)
{
int i = 0;
for (i = 0; i < N; i++) {
printf("%d\n", *(a + i));
}
printf("\n");
}
int max(int *a)
{
int i = 0;
int max = 0;
max = *a;
for (i = 1; i < N; i++) {
if (*(a + i) > max) max = *(a + i);
}
return max;
}
void count_sort(int *a, int *b, int k)
{
int i = 0;
int *c = (int *)malloc(sizeof(k * sizeof(int)));
memset(c, 0, k * sizeof(int));
for (i = 0; i < N; i++) {
*(c + *(a + i)) +=1;
}
for (i = 1; i <= k; i++) {
*(c + i) += *(c + i -1);
}
for (i = N - 1; i >= 0; i--) {
*(b + (*(c + *(a + i))) - 1) = *(a + i);
*(c + *(a + i)) -= 1;
}
}
int main()
{
int a[N];
int b[N] = {0};
ran(a);
pri(a);
count_sort(a, b, max(a));
pri(b);
return 0;
}
1.下标的思想才是王道。深入理解下标,能力提升一大步。
2.在精不在多。
3.练习才是王道。不断的打代码,才能出真知。
计数排序:
1.思想:
对每一个输入的元素 X ,确定出小于 X 的元素的个数。然后把 X 直接放到它的最终的数组中的位置上。
2.伪代码:
COUNTING-SORT( A, B, k)
for i <---- 0 to k
do C[ i ] <---- 0
for j <---- 1 to length[ A ]
do C[ A [ j ]] <---- C [ A [ j ] ] + 1
::C [ i ] 包含等于 i 的元素的个数
for i <---- 1 to k
do C [ i ] <---- C [ i ] + C [ i - 1 ]
::C [ i ] 包含小于等于 i 的元素的个数
for j <----length[ A ] downto 1
do B[ C [ A [ j ]]] = A [ j ]
C [ A [ j ] ] <---- C [ A [ j ] ] - 1
程序代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 55
void ran(int *a)
{
int i = 0;
for (i = 0; i < N; i++) {
*(a + i) = rand() % 100;
}
}
void pri(int *a)
{
int i = 0;
for (i = 0; i < N; i++) {
printf("%d\n", *(a + i));
}
printf("\n");
}
int max(int *a)
{
int i = 0;
int max = 0;
max = *a;
for (i = 1; i < N; i++) {
if (*(a + i) > max) max = *(a + i);
}
return max;
}
void count_sort(int *a, int *b, int k)
{
int i = 0;
int *c = (int *)malloc(sizeof(k * sizeof(int)));
memset(c, 0, k * sizeof(int));
for (i = 0; i < N; i++) {
*(c + *(a + i)) +=1;
}
for (i = 1; i <= k; i++) {
*(c + i) += *(c + i -1);
}
for (i = N - 1; i >= 0; i--) {
*(b + (*(c + *(a + i))) - 1) = *(a + i);
*(c + *(a + i)) -= 1;
}
}
int main()
{
int a[N];
int b[N] = {0};
ran(a);
pri(a);
count_sort(a, b, max(a));
pri(b);
return 0;
}