2.1 插入排序
#include <stdio.h>
#include <stdlib.h>
#define TRACE_SUBSTEPS 1
void func2_1() {
int A[] = {5, 2, 4, 6, 1, 3, 10, 3, 5};
int key = 0;
int j = 0, i = 0, k = 0;
//============print sub title===============
printf("2.1 Insertion-Sort\n\n");
//============print old Array===============
printf("Old Array: A[] = ");
for (k = 0; k < sizeof(A)/sizeof(int); k++) {
if (k == 0) {
printf("{%d,", A[k]);
} else if ( k == (sizeof(A)/sizeof(int) - 1)) {
printf(" %d}\n", A[k]);
} else {
printf(" %d,", A[k]);
}
}
if (sizeof(A)/sizeof(int) <= 1) {
goto l_done;
}
//==================INSERTION-SORT==============
for (j = 1; j < sizeof(A)/sizeof(int); j++) {
key = A[j];
i = j - 1;
while(i >= 0 && A[i] > key) {
A[i+1] = A[i];
i = i - 1;
}
A[i + 1] = key;
#if TRACE_SUBSTEPS
printf("\tj=%d, and result:\n\t\tA[] = ", j);
for (k = 0; k < sizeof(A)/sizeof(int); k++) {
if (k == 0) {
printf("{%d,", A[k]);
} else if ( k == (sizeof(A)/sizeof(int) - 1)) {
printf(" %d}\n", A[k]);
} else {
printf(" %d,", A[k]);
}
}
#endif //TRACE_SUBSTEPS
}
l_done:
//============print sorted ARRAY=================
printf("Sorted Array: A[] = ");
for (k = 0; k < sizeof(A)/sizeof(int); k++) {
if (k == 0) {
printf("{%d,", A[k]);
} else if ( k == (sizeof(A)/sizeof(int) - 1)) {
printf(" %d}\n", A[k]);
} else {
printf(" %d,", A[k]);
}
}
}
注意: 伪代码里数组下标是从1开始数的。
运行结果:
================第2章 算法基础==============
2.1 Insertion-Sort
Old Array: A[] = {5, 2, 4, 6, 1, 3, 10, 3, 5}
j=1, and result:
A[] = {2, 5, 4, 6, 1, 3, 10, 3, 5}
j=2, and result:
A[] = {2, 4, 5, 6, 1, 3, 10, 3, 5}
j=3, and result:
A[] = {2, 4, 5, 6, 1, 3, 10, 3, 5}
j=4, and result:
A[] = {1, 2, 4, 5, 6, 3, 10, 3, 5}
j=5, and result:
A[] = {1, 2, 3, 4, 5, 6, 10, 3, 5}
j=6, and result:
A[] = {1, 2, 3, 4, 5, 6, 10, 3, 5}
j=7, and result:
A[] = {1, 2, 3, 3, 4, 5, 6, 10, 5}
j=8, and result:
A[] = {1, 2, 3, 3, 4, 5, 5, 6, 10}
Sorted Array: A[] = {1, 2, 3, 3, 4, 5, 5, 6, 10}
请按任意键继续. . .
习题:2.1-2
#include <stdio.h>
#include <stdlib.h>
#define TRACE_SUBSTEPS 1
void func2_1_1() {
int A[] = {5, 2, 4, 6, 1, 3, 10, 3, 5};
int key = 0;
int j = 0, i = 0, k = 0;
//============print sub title===============
printf("2.1-1 Insertion-Sort\n\n");
//============print old Array===============
printf("Old Array: A[] = ");
for (k = 0; k < sizeof(A)/sizeof(int); k++) {
if (k == 0) {
printf("{%d,", A[k]);
} else if ( k == (sizeof(A)/sizeof(int) - 1)) {
printf(" %d}\n", A[k]);
} else {
printf(" %d,", A[k]);
}
}
if (sizeof(A)/sizeof(int) <= 1) {
goto l_done;
}
//==================INSERTION-SORT==============
for (j = (sizeof(A)/sizeof(int) - 2); j >= 0; j--) {
key = A[j];
i = j + 1;
while(i< (sizeof(A)/sizeof(int)) && A[i] > key) {
A[i-1] = A[i];
i++;
}
A[i-1] = key;
#if TRACE_SUBSTEPS
printf("\tj=%d, and result:\n\t\tA[] = ", j);
for (k = 0; k < sizeof(A)/sizeof(int); k++) {
if (k == 0) {
printf("{%d,", A[k]);
} else if ( k == (sizeof(A)/sizeof(int) - 1)) {
printf(" %d}\n", A[k]);
} else {
printf(" %d,", A[k]);
}
}
#endif //TRACE_SUBSTEPS
}
l_done:
//============print sorted ARRAY=================
printf("Sorted Array: A[] = ");
for (k = 0; k < sizeof(A)/sizeof(int); k++) {
if (k == 0) {
printf("{%d,", A[k]);
} else if ( k == (sizeof(A)/sizeof(int) - 1)) {
printf(" %d}\n", A[k]);
} else {
printf(" %d,", A[k]);
}
}
}
运行结果:
================第2章 算法基础==============
2.1-1 Insertion-Sort
Old Array: A[] = {5, 2, 4, 6, 1, 3, 10, 3, 5}
j=7, and result:
A[] = {5, 2, 4, 6, 1, 3, 10, 5, 3}
j=6, and result:
A[] = {5, 2, 4, 6, 1, 3, 10, 5, 3}
j=5, and result:
A[] = {5, 2, 4, 6, 1, 10, 5, 3, 3}
j=4, and result:
A[] = {5, 2, 4, 6, 10, 5, 3, 3, 1}
j=3, and result:
A[] = {5, 2, 4, 10, 6, 5, 3, 3, 1}
j=2, and result:
A[] = {5, 2, 10, 6, 5, 4, 3, 3, 1}
j=1, and result:
A[] = {5, 10, 6, 5, 4, 3, 3, 2, 1}
j=0, and result:
A[] = {10, 6, 5, 5, 4, 3, 3, 2, 1}
Sorted Array: A[] = {10, 6, 5, 5, 4, 3, 3, 2, 1}
请按任意键继续. . .
2.2-2 选择排序
#include <stdio.h>
#include <stdlib.h>
#define TRACE_SUBSTEPS 1
void func2_2_2() {
int A[] = {5, 2, 4, 6, 1, 3, 10, 3, 11};
int j = 0, i = 0, z = 0, k = 0;
int tmp = 0;
//============print sub title===============
printf("2.2-2 Selection-Sort\n\n");
//============print old Array===============
//FIXME: A has 1 member.
printf("Old Array: A[] = ");
for (k = 0; k < sizeof(A)/sizeof(int); k++) {
if (k == 0) {
printf("{%d,", A[k]);
} else if ( k == (sizeof(A)/sizeof(int) - 1)) {
printf(" %d}\n", A[k]);
} else {
printf(" %d,", A[k]);
}
}
if (sizeof(A)/sizeof(int) <= 1) {
goto l_done;
}
//=============SELECTION-SHORT=================
for (j = 0; j < (sizeof(A)/sizeof(int) - 1); ++j) {
i = j + 1;
z = j;
for(; i < (sizeof(A)/sizeof(int)); ++i) {
if (A[z] > A[i]) {
z = i;
}
}
if ( k != j) {
tmp = A[j];
A[j] = A[z];
A[z] = tmp;
}
#if TRACE_SUBSTEPS
//FIXME: A has 1 member.
printf("\tj=%d, and result:\n\t\tA[] = ", j);
for (k = 0; k < sizeof(A)/sizeof(int); k++) {
if (k == 0) {
printf("{%d,", A[k]);
} else if ( k == (sizeof(A)/sizeof(int) - 1)) {
printf(" %d}\n", A[k]);
} else {
printf(" %d,", A[k]);
}
}
#endif //TRACE_SUBSTEPS
}
l_done:
//============print sorted ARRAY=================
//FIXME: A has 1 member.
printf("Sorted Array: A[] = ");
for (k = 0; k < sizeof(A)/sizeof(int); k++) {
if (k == 0) {
printf("{%d,", A[k]);
} else if ( k == (sizeof(A)/sizeof(int) - 1)) {
printf(" %d}\n", A[k]);
} else {
printf(" %d,", A[k]);
}
}
}
运行结果:
================第2章 算法基础==============
2.2-2 Selection-Sort
Old Array: A[] = {5, 2, 4, 6, 1, 3, 10, 3, 11}
j=0, and result:
A[] = {1, 2, 4, 6, 5, 3, 10, 3, 11}
j=1, and result:
A[] = {1, 2, 4, 6, 5, 3, 10, 3, 11}
j=2, and result:
A[] = {1, 2, 3, 6, 5, 4, 10, 3, 11}
j=3, and result:
A[] = {1, 2, 3, 3, 5, 4, 10, 6, 11}
j=4, and result:
A[] = {1, 2, 3, 3, 4, 5, 10, 6, 11}
j=5, and result:
A[] = {1, 2, 3, 3, 4, 5, 10, 6, 11}
j=6, and result:
A[] = {1, 2, 3, 3, 4, 5, 6, 10, 11}
j=7, and result:
A[] = {1, 2, 3, 3, 4, 5, 6, 10, 11}
Sorted Array: A[] = {1, 2, 3, 3, 4, 5, 6, 10, 11}
请按任意键继续. . .
2.3 归并排序(分治法)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#define TRACE_SUBSTEPS 1
#define MAX_VALUE INT_MAX
static void merge(int *A, int p, int q, int r) {
int n1 = q - p + 1;
int n2 = r - q;
int *L = (int *)malloc((n1 + 1) * sizeof(int));
int *R = (int *)malloc((n2 + 1) * sizeof(int));
int i = 0, j = 0, k = 0;
if (L == NULL || R == NULL) {
printf("Error: Out of memery!\n");
goto l_ret;
}
//Here, don't use memcpy function.
for (i = 0; i < n1; i++) {
L[i] = A[p + i];
}
for (j = 0; j < n2; j++) {
R[j] = A[q + 1 + j];
}
L[n1] = MAX_VALUE;
R[n2] = MAX_VALUE;
i = 0; j = 0;
for ( k = p; k <= r; k++) {
if (L[i] < R[j]) {
A[k] = L[i];
i++;
} else {
A[k] = R[j];
j++;
}
}
l_ret:
if (L)
free(L);
if (R)
free(R);
}
static void merge_sort(int *A, int p, int r) {
int q = 0;
if (p < r) {
q = (p + r)/2;
merge_sort(A, p, q);
merge_sort(A, q + 1, r);
merge(A, p, q, r);
}
}
void func2_3() {
int A[] = {5, 2, 4, 6, 1, 3, 10, 3, 11};
int k = 0;
//============print sub title===============
printf("2.3 Divide&Conquer-Sort\n\n");
//============print old Array===============
//FIXME: A has 1 member.
printf("Old Array: A[] = ");
for (k = 0; k < sizeof(A)/sizeof(int); k++) {
if (k == 0) {
printf("{%d,", A[k]);
} else if ( k == (sizeof(A)/sizeof(int) - 1)) {
printf(" %d}\n", A[k]);
} else {
printf(" %d,", A[k]);
}
}
merge_sort(A, 0, sizeof(A)/sizeof(int) - 1);
//============print sorted ARRAY=================
//FIXME: A has 1 member.
printf("Sorted Array: A[] = ");
for (k = 0; k < sizeof(A)/sizeof(int); k++) {
if (k == 0) {
printf("{%d,", A[k]);
} else if ( k == (sizeof(A)/sizeof(int) - 1)) {
printf(" %d}\n", A[k]);
} else {
printf(" %d,", A[k]);
}
}
}
运行结果:
================第2章 算法基础==============
2.3 Divide&Conquer-Sort
Old Array: A[] = {5, 2, 4, 6, 1, 3, 10, 3, 11}
Sorted Array: A[] = {1, 2, 3, 3, 4, 5, 6, 10, 11}
请按任意键继续. . .