关于C语言的冒泡排序优化及鸡尾酒排序
/*对于冒泡排序的公式分享,其实只要把公式背下来就行,没有什么大碍,本人新手,大一新生,
对于排序的算法,我第一个接触的排序算法就是冒泡排序,下面我就简单给一个例子,其实我个人
觉得冒泡公式的式子只要 背下来就可以使用了。*/
//输入四个数字未例子进行冒泡排序。
#include <stdio.h>
int main()
{ int i,j,n,a[66],temp;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
//下面进行排序的第一个循环,冒泡循环有两个for的循环,第一个是i,第二个是j循环的进行。
for(i=0;i<n-1;i++) //这个公式可以直接背下来,感觉用久了自然就会了
{
for(j=0;j<n-i-1;j++)
{
temp = 0; //这个很重要的,temp = 0要在第二个for循环里第一个执行语句,这样才能确保,冒泡循环的正常执行
if(a[j]>a[j+1]){//需要注意的事情是‘a【】’里面的那个数组的下标是需要运用'j',这样才能完成冒泡排序。
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
//两个for循环完成了,那这个冒泡的排序也就完成了,接下来就是把数组从小到大进行输出了。
printf("数组的数字从小到大输出是: \n");
for(i=0;i<n;i++)
{
printf("%d\n",a[i]);
}
return 0;
}
/*当然,对于冒泡排序的补充还是有更好的方法,就是对冒泡排序进行优化,这个方法很有趣,
就是可以提高冒泡排序地速度,因为冒泡排序很逗的,就是不去检查通过计算机输入的数组是
否是有顺序 ,直接给进行冒泡排序,假若输入的数字是 1 2 3 4 5 6 7 8 9 这种有顺序的数
组,她还是会花时间去进行排序,这样是会浪费时间的,所以要使用一个判断可以判断这种情
况以便减少时间的花费。 */
#include <stdio.h>
int main ()
{
int i,j,n,a[66],temp;
int flag; //看见其他的方法是使用布尔变量实现的,但我还没学,我就用一个旗帜完成这个判断。
flag = 1;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i-1;j++)
{
temp = 0;
if(a[j]>a[j+1])
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
/*这里进行旗帜的转换
假若里面的这个for是符合 a【j】>a【j+1】
进行了转化的话则这一步可以进行
则转换旗帜的数字,确定要进行里面的for循环,起不到提高速度的结果*/
flag = 0;
}
}
//这里有一个特别的点,就是旗帜的系数判断转化是要放在第一个for的最后,确定第二个for是否要继续进行下去
if(flag==1){
//if包括的语句一定要用花括号括起来啊,这是一个好习惯呢,老师说的,哈哈哈。
break;
}
}
//接下来就是输出了
for(i=0;i<n;i++){
printf("%d\n",a[i]);
}
return 0;
}
/*关于冒泡排序的第二种优化,我是受CSDN的一篇文章启发的,所以我要感谢这博主。
这个方法是:双向进行冒泡排序,左右都进行冒泡排序,但有趣的是,这个‘左右’不
是左右同时进行然后到终点,而是先利用一个循环把最小的那个数放在最左边,然后
利用另一个循环把最大的那个数放在左右边,再把第二个小的数放在左边第二个位置
循环在继续,把第二大的那个数放在右边倒数第二个位置上,就是这让循环进行,这
种排序方式也叫做鸡尾酒排序,不知道为什么取这个名字,感觉真的很有趣
但无法运行出来,我大一新生一个月,技术有限,抱歉啊,我给出这个敲得中间部分*/
int i,j,a[66],n;
int h;
int left,right;
int lenght;
int temp;
scanf("%d",&n);//如果要进行数组的左右分界排序,就要取到数组的长度再进行分配给一边
for(h=0;h<n;h++)
{
scanf("%d",&a[h]);
}
//接下来就是进行数组的测量长度了,ringh的长度是lenght长度减去一的长度
//lenght = sizeof(a)/sizeof(int);
lenght = sizeof(a)/sizeof(a[0]);
right = lenght-1;
left = 0;
//先给右边的赋值,因为右边的先排出数组里面的最大值 ,外层先装一个代表right的for循环吧
while(right>left)
{
//下面的两个for循环是平等关系的,用一个while循环把她们括起来
for(i=left;i<right;i++)
{ temp = 0;
//第一个for循环里面的交替是进行左边的值比较与交换,就是针对左边的较大数字排序
if(a[i]>a[i+1])
{
temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
}
}
right--;//这样满足下一次摆放的那个数是放在右边的倒数第二个位置上面
temp = 0;
for(j=right;j>left;j--)
{
//内部的for循环是进行右边的数字大小排序,就是把比较小的数字放在右边的位置。
if(a[j]<a[j-1])
{
temp = a[j];
a[j] = a[j-1];
a[j-1] = temp;
}
}
left++;//这样满足下一次左边放着第二大的数字是再左边第二个位置上面
}
/*最后就是打印出数组的
数字排列了*/