C语言的冒泡排序优化及鸡尾酒排序问题分解知识点

关于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++;//这样满足下一次左边放着第二大的数字是再左边第二个位置上面 		
}
			/*最后就是打印出数组的
			数字排列了*/



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值