大家好今天一个CSDN的新人前来报到请大家多多指教,今天以一个冒泡排序的例子开始我的CSDN的人生吧!
hello 大家好我是三天才注册CSDN博客的一个学生,在接触到CDN之后发现它的优美与便利,这里有很多的交流,分享,发现。今天这是我的第一篇文稿,“我来了,我看见了,我征服了” ----凯撒大帝,我希望在我的未来我也会变成一个有能力的“征服者” 。
好了废话不多说,伴随着我的“诞生”,我现在在CSDN这个大家庭位大家多多的交流,分享,让大家共同进步,以后有问题我们可以一起解决。目前我学习的是C语言,以后我相信我会学会更多的东西,希望大家在以后可以给予我一下帮助呀,我会尽力用我所学来解决一些问题。
好的接下来就是我的第一篇文章:C语言必备知识点——冒泡排序
这是一个简单的实例:10个学生的成绩排序,如需改动学生个数及数组长度可以直接修改,或者动态分配内存定义动态数组。这在以后我们会继续写道的。
// 程序设计报告1,冒泡排序的实验报告,使用白盒测试,对冒泡排序,和改进版的冒泡排序进行测试
// 原创作者:蔡徐坤(HK)
#include<stdio.h>
#define N 10
int student_socre_sort(int []); //普通版冒泡排序
int pro_student_socre_sort(int []); //改进版冒泡排序
int main()
{
int student_socre[N] = {0}; //初始化为0
printf("please input ten students 's cosre :\n");
for(int i=0 ;i<N ;i++) //输入学生成绩
scanf("%d",&student_socre[i]);
student_socre_sort(student_socre); //普通版冒泡排序:
pro_student_socre_sort(student_socre); //改进版马冒泡排序,接下来将会用到计算两种排序的时间复杂度和空间复杂度
return 0;
}
int student_score_sort(int student_socre[]) //普通版本的冒泡排序
{
int i, j;
for (i = 0; i < N;i++) //循环N-1次,每一次都进行一次比较找到该轮中的最大,并且将最大的放到前面一次排序下来,并且比较\
比较几点向后移动一位
{
for (j = i;j < N - i;j++) //每次比较从基点开始,向后移动,依次进行比较 ,并且将符合排序规则的数与当前数进行交换后再比较
{
if (student_socre[i] < student_socre[j]) //比较交换数
{
int tmp = student_socre[i];
student_socre[i] = student_socre[j];
student_socre[j] = tmp;
}
}
}
printf("排序后的学生成绩为:\n");
for (i = 0;i < N;i++)
{
printf("%d ",student_socre[i]);
}
return 0;
}
//一般的冒泡排序方法有可能会在已经排好序的情况下继续比较,改进的冒泡排序
//设置了一个哨兵flag,如果一次for循环没有进行交换,则元素已经排好序,由哨兵控制退出循环。
int pro_student_socre_sort(int student_socre[]) //改进版冒泡排序
{
int i,j, flag = 1; //设置一个哨兵flag,如果一次for循环没有进行交换,则元素已经排好序,由哨兵控制退出循环。
for (i = 0; i < N;i++)
{
flag = 1; //哨兵设置
for (j = i;j < N - i;j++) {
if (student_socre[i] < student_socre[j]) //比较交换数
{
int tmp = student_socre[i];
student_socre[i] = student_socre[j];
student_socre[j] = tmp;
flag = 0;
}
if (flag == 1) // 设置的哨兵判断是否有做过排序。如果一次都没有作就退出了
break;
}
}
printf("排序后的学生成绩为:\n");
for (i = 0;i < N;i++)
{
printf("%d ", student_socre[i]);
}
return 0;
}
排序的思想就是每遍历一次把最大的元素放到最前。通俗的讲,冒泡排序的原理就是:先开启第一轮排序将第一、第二个元素进行比较,大的元素放在第二个元素位置上,然后再拿第二个元素和第三个元素进行比较,直到倒数第二个元素和最后一个元素相比较,将大的元素放在最前个元素位置上,这样就实现了最大的元素到了最前面。再开启第二轮排序,和第一轮排序规则一样从第一个元素到倒数第二个元素进行一一比较,将第二大的元素放在第二个元素的位置上。重复上面的排序规则,直到没有数字需要比较为止。
下面是一个一个自己绘制的简单流程图,仅仅作为一个简单的思路,没有绘制出完整过程深感遗憾。
上面是我的代码,可能有很多的错误,漏洞,欢迎各位观众爸爸,及时指出。我会在未来的日子里面写一些详细的有关C与C++的教材,经典案例,从我们的hello world开始为大家详细的分享我们的乐趣。