冒泡排序的算法示例
将一个数组内每两个相邻元素之间,逐对地进行对比。如果对比的结果是前面元素大于后面元素,则将这一对元素的数值进行交换。这样数值较大的数值,在整个数组中,就如同气泡一样地被推向数组尾部。
#include <stdio.h>
#include <stdlib.h>
int a[] = {33, 6, 5, 4, 42, 21, 11, 40, 31, 8};
int main() {
int i = 0;
while (i < _countof(a) - 1) {
if (a[i] > a[i + 1]) {
int t = a[i];
a[i] = a[i + 1];
a[i + 1] = t;
}
++i;
}
return 0;
}
实例演示,从前往后排 & 从后往前排
#include <stdio.h>
void sort1(int p[], int nLen) { // 将最大值推到尾部
int i, j;
for (i = 0; i < nLen - 1; i++) {
for (j = 0; j < nLen - 1 - i; j++) {
if (p[j] > p[j + 1]) {
int temp = p[j];
p[j] = p[j + 1];
p[j + 1] = temp;
}
}
}
}
void sort2(int p[], int nLen) { // 将最小值推到尾部
int i, j;
for (i = 0; i < nLen - 1; i++) {
for (j = 0; j < nLen - 1 - i; j++) {
if (p[j] < p[j + 1]) {
int temp = p[j];
p[j] = p[j + 1];
p[j + 1] = temp;
}
}
}
}
void sort3(int p[], int nLen) { // 将最大值推到头部
for (int i = 0; i < nLen - 1; i++) {
for (int j = nLen - 1; j > i; j--) {
if (p[j] > p[j - 1]) {
int temp = p[j];
p[j] = p[j - 1];
p[j - 1] = temp;
}
}
}
}
void sort4(int p[], int nLen) { // 将最小值推到头部
for (int i = 0; i < nLen - 1; i++) {
for (int j = nLen - 1; j > i; j--) {
if (p[j] < p[j - 1]) {
int temp = p[j];
p[j] = p[j - 1];
p[j - 1] = temp;
}
}
}
}
void PrintArray(int p[], int nLen) {
for (int i = 0; i < nLen; i++) {
printf("%-4d ", p[i]);
}
putchar(10);
}
int main() {
int a[] = { 33, 6, 5, 4, 42, 21, 11, 40, 31, 8 };
int nLen = sizeof(a) / sizeof(a[0]);
printf("原始数组:\n");
PrintArray(a, nLen);
printf("\n将最大值推到尾部:\n");
sort1(a, nLen);
PrintArray(a, nLen);
printf("将最小值推到尾部:\n");
sort2(a, nLen);
PrintArray(a, nLen);
printf("将最大值推到头部:\n");
sort3(a, nLen);
PrintArray(a, nLen);
printf("将最小值推到头部:\n");
sort4(a, nLen);
PrintArray(a, nLen);
return 0;
}
运行结果:
原始数组:
33 6 5 4 42 21 11 40 31 8
将最大值推到尾部:
4 5 6 8 11 21 31 33 40 42
将最小值推到尾部:
42 40 33 31 21 11 8 6 5 4
将最大值推到头部:
42 40 33 31 21 11 8 6 5 4
将最小值推到头部:
4 5 6 8 11 21 31 33 40 42
or 使用指针
#include <stdio.h> void swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } void sort1(int p[], int nLen) { for (int i = 0; i < nLen - 1; i++) { for (int j = 0; j < nLen - 1 - i; j++) { if (p[j] > p[j + 1]) { swap(&p[j], &p[j + 1]); } } } } void sort2(int p[], int nLen) { for (int i = 0; i < nLen - 1; i++) { for (int j = 0; j < nLen - 1 - i; j++) { if (p[j] < p[j + 1]) { swap(&p[j], &p[j + 1]); } } } } void sort3(int p[], int nLen) { for (int i = 0; i < nLen - 1; i++) { for (int j = nLen - 1; j > i; j--) { // 从后往前 if (p[j] > p[j - 1]) { swap(&p[j], &p[j - 1]); } } } } void sort4(int p[], int nLen) { for (int i = 0; i < nLen - 1; i++) { for (int j = nLen - 1; j > i; j--) { // 从后往前 if (p[j] < p[j - 1]) { swap(&p[j], &p[j - 1]); } } } } void PrintArray(int p[], int nLen) { for (int i = 0; i < nLen; i++) { printf("%-4d", p[i]); } printf("\n"); } int main() { int a[] = { 33, 6, 5, 4, 42, 21, 11, 40, 31, 8 }; int nLen = sizeof(a) / sizeof(a[0]); printf("原 始 数 组:"); PrintArray(a, nLen); putchar(10); // 使用四种排序函数进行排序并打印结果 printf("最大值移到末尾:"); sort1(a, nLen); PrintArray(a, nLen); printf("最小值移到末尾:"); sort2(a, nLen); PrintArray(a, nLen); printf("最大值移到开头:"); sort3(a, nLen); PrintArray(a, nLen); printf("最小值移到开头:"); sort4(a, nLen); PrintArray(a, nLen); return 0; } ```