c语言上,冒泡排序法、顺序排序法有什么好的办法记忆啊,老是忘记。_百...
发布网友
发布时间:2024-10-02 15:39
我来回答
共2个回答
热心网友
时间:2024-10-03 17:12
建议你记方法 不要记程序 要用的时候根据方法自己写程序 或许每次写的程序都不同 但是只要方法对 都是可以高效运行的
如果死记程序 那么以后遇到复杂度更高的堆排序多路归并等外部排序的话 困难会更大
热心网友
时间:2024-10-03 17:14
有点长、、、、
冒泡排序的理解方法
比如, 有这么一个数组 :int a[3] = {3,2,1};
先不考虑怎么对这个数组进行排序,我们先拿数组a中的3 和 2 进行比较,先让3和2的位置对调先。
代码如下 :
#include <stdio.h>
int main(void)
{
int a[3] = {3,2,1};
for (int i=0; i<3; i++)
{
if (a[i] > a[i+1])
{
int temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
}
}
for(int k=0; k<3; k++)
{
printf("%d\n", a[k]);
}
return 0;
}
我们来分析下这个代码, 先看for 循环执行一次后。数组a的元素位置发生了什么变化?
可以很容易的看出,第一次for 循环,只是拿了 3 和 2 进行对比, 3 > 2, 它们的位置当然得对调了。
第一次执行for 循环数组内部变为如下 :
2,3,1
然后for循环继续,i变成了1。 现在的a[i] 是3,对吧?自然的a[i+1]就是1了。那么,3>1
它们的位置当然也得对调。
第二次执行for 循环数组内部变为如下 :
2,1,3
然后for循环继续,可以看出,第三次的for 循环是多余的。因为3已经和后面的全部数字进行对比过了。所以,这个for 循环我们应该这样才正确, 如下 :
for (int i=0; i<3 - 1; i++)
3 - 1 就是数组的长度减1。
好了,现在的数组内部的顺序变成了这样了 :
2,1,3
可以看到,如果可以在执行多一次for 循环, 2 和 1 对比, 在对调2 和1的位置。那么这个程序就完成了排序的功能了。
那怎么修改这个程序,让它在执行多一次for 循环呢?
很简单, 只要在for 循环外面弄多一个for 循环, 让它执行内部的for 循环2次, 就可以了。 如下 :
for (int j=0; j<3-1; j++)//外面for 循环要3 - 1, 和上面的原因一样。
{
for (int i=0; i<3-1; i++)//这里要减j,是因为最后一个数3是不用在和其它数进行对比
{
if (a[i] > a[i+1])
{
int temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
}
}
}
整体的代码如下 :
#include <stdio.h>
int main(void)
{
int a[3] = {3,2,1};
for (int j=0; j<3-1; j++)
{
for (int i=0; i<3-1-j; i++)
{
if (a[i] > a[i+1])
{
int temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
}
}
}
for(int k=0; k<3; k++)
{
printf("%d\n", a[k]);
}
return 0;
}