#include "stdio.h"
void main() {
//要排序的数字个数
int count = 3;
//原始数组
int arrays[100];
//用于for循环
int i;
//声明函数
void sort();
printf("请输入要排序的数字的个数:");
scanf("%d", &count);
//填充原始数组
for (i = 0; i < count; i++) {
printf("请输入第%d个数字:", i + 1);
scanf("%d", &arrays[i]);
}
sort(arrays, count);
printf("数据排序结果为:\n");
for (i = 0; i < count; i++) {
printf("%d ", arrays[i]);
}
}
//进行排序的函数
void sort(int *p, int count) {
int i;
int j, temp;
int *p1;
//开始两个指针都指向数组的起始位置即arrays[0];
p1 = p;
/*如果要排序的数组长度为length,那么冒泡排序的时候外层循环就得走length-1趟,
每一趟确定一个元素的位置,例如5个数,外层循环就得走4次,走完四次后所有元素的位置都确定了。*/
for (i = 0; i < count - 1; i++) {
//每一趟比较前 p指针都得回到数组的的起始位置即arrays[0];
p = p1;
//为什么要"-i",因为每一次进入到到下面的循环的时候,都已经确定了数组后面"i"个元素的位置,不用再管这些元素。
//为什么要"-1",因为在比较的时候,是用第"i"个元素与第"i+1"个元素相比,如果到了数组的最后一个元素,那"i+1"就会越界(C语言中数组在不同编译器下好像有的可以越界,不重要不管了)。
for (j = 0; j < count - i - 1; j++) {
//如果*p+1指向的值大于p指向的值,交换两个数的位置
if ((*p) > (*(p + 1))) {
//这里的"*"是取值运算符,即"*P"指的是取出p指针指向的地址所存的值,"*(p+1)"是取出p指针下一位指向的地址存的值;
//借助中间变量完成数据交换
temp = *(p + 1);
*(p + 1) = *p;
*p = temp;
}
//p指针前进,比较下一位元素
p++;
}
}
}
优化
是不是一定要走完数组的length-1
趟才能完成冒泡排序,肯定不是,当某一趟循环没有发生元素交换的时候,数组排序已经完成了,所以我们可以设置一个标志,一旦某一趟循环没有发生元素交换结束排序即可。
#include "stdio.h"
void main() {
int count = 3;
int arrays[100];
int i;
void sort();
printf("请输入要排序的数字的个数:");
scanf("%d", &count);
//填充原始数组
for (i = 0; i < count; i++) {
printf("请输入第%d个数字:", i + 1);
scanf("%d", &arrays[i]);
}
sort(arrays, count);
printf("数据排序结果为:\n");
for (i = 0; i < count; i++) {
printf("%d ", arrays[i]);
}
}
void sort(int *p, int count) {
int i;
int j, temp;
int *p1;
//统计元素的比较次数
int count1 = 0;
p1 = p;
for (i = 0; i < count - 1; i++) {
p = p1;
//设置标志位
int flag = 1;
for (j = 0; j < count - i - 1; j++) {
count1++;
if ((*p) > (*(p + 1))) {
//只要发生了交换,将标志位设置为0
flag = 0;
temp = *(p + 1);
*(p + 1) = *p;
*p = temp;
}
p++;
}
//走完上一趟发现标志位没有改变说明数组已经有序,结束循环
if (flag == 1) {
break;
}
}
printf("比较了%d次", count1);
}
初学C语言,如有错误,还望指正,因考试需要,代码运行环境为:
不同编译器和不同版本C语言代码略有不同。