2021-07-30

升级的冒泡排序

基于冒泡排序的排序方法,首先,冒泡排序是通过两重循环实现数组里面的数字两两相比较,大的数字统一往一边移动,最后得到的就是拍照一个方向的大小排序好的数组。

升级版的也就是每一次循环直接找到最大的数,然后把这个数字放到数组的最后面,其他的数字不改变原来的排列顺序,这样的话,在最后的循环排序结束之后,就得到了从小到大排序好的数组了。

以函数的形式写代码

void qBubbleSort( int data[] ,int n )  // 8 38 49 65 97 76 1 13 27 49  
{
  //先找出最大的数字
  //print(data, n);
  if(data[1]>=data[0] && data[2]>=data[1] && data[3]>=data[2] && data[4]>=data[3]&&data[5]>=data[4]&&data[6]>=data[5]&&data[7]>=data[6]&&data[8]>=data[7]&&data[9]>=data[8]) 
  { 
    print(data,n);
      //这里的话使用while循环肯定是更好的,只是我不想弄那么多了 
  }
  else
{

  for(int t = 0; t< n;t++)
  { 
  int temp[n];
  int key = 0;  // 最大的数的下标 
  
  for(int j=0;j<n;j++)
  {
    temp[j]= data[j];
  }
  //print(temp,n);
  for(int i = 0;i<n-1-t;i++)  // 一直出错的地方就是这里了  ,按照输出要求做 
  { 
    
    if(temp[i]>temp[i+1])   // 进行到temp[8]  > temp[9] 
    {
	  temp[i+1]= temp[i];
	}
	else
	{
	  key = i+1;  // 设置大小不交换,下标换成大的数字的下标 
	} 
  } 
  //printf("%d %d ", temp[key], key);  //检测输出正确
  if(key != n-1)   // 排除最后面的数是最大的 
  {
  for(int m=key;m<n-1-t;m++)   
  {
    data[m] = data[m+1];
  }
  data[n-1-t] = temp[key]; //将最大值放到后面,除去前面循环排好的 
  print(data, n);
  }
  //qBubbleSort(data, n-1);
  //if(data[9]>=data[8]>=data[7]>=data[6]>=data[5]>=data[4]>=data[3]>=data[2]>=data[1]>=data[0])
  if(data[1]>=data[0] && data[2]>=data[1] && data[3]>=data[2] && data[4]>=data[3]&&data[5]>=data[4]&&data[6]>=data[5]&&data[7]>=data[6]&&data[8]>=data[7]&&data[9]>=data[8]) 
  { 
    
    break;  //这里的话使用while循环肯定是更好的,只是我不想弄那么多了 
  }
}
}
}

在这里,我是假设好了传进去的数组的长度是10,一开始的判断是为了排除一开始的数组就已经是按照顺序排列好了的。不过这个代码还没有处理好,当数组里面有重复的数字的时候要同时操作往后面移动,不过最后的结果也是可以实现排好序的,只是效率不高,执行次数更加多罢了。

好,实际上前面的东西都是瞎扯

改进的冒泡排序是为了避免,原本的数列已经排好序了,但是还要重新执行一次比较的代码,为了提高效率,优化代码,设置一个标志位flag,来判断条件是否成立,如果数列本身就是有序的就直接跳出。

下面是改过的代码

void qBubbleSort(int data[],int n)
{   
    //先判断原来的数列一开始就是按照大小排序的 
    int time=0;   
	for(int t=0;t<n-1;t++)
	{
	  if(data[t]<data[t+1])
	  {
	    time = time + 1;
	  }
	}
	if(time == 9)
	{
	  print(data,n);
	} 
	else
	{
	
	int flag=1;  //添加标志位
	for(int i=0;i<n-1;i++)  //控制比较的趟数
	{
		flag=1;
		for(int j=0;j<n-1-i;j++)  //控制每趟比较的次数
		{
			if(data[j] > data[j+1])  //降序排列
			{
				int tmp=data[j];
				data[j]=data[j+1];
				data[j+1]=tmp;
				flag=0;
			}
		}
		if(flag == 1) break;
	print(data,n);
	}
} 
}

值得一说的是原数列已经是按照从大到小排序好的话就直接输出就好了,这里的输出函数print(data,n)自己另外定义输出。

一开始flag是 1

第一次比较是 data[0] >data[1]
把大的数字往后面沉,然后就是交换次序,交换的同时,把flag赋值成 0

如果没有进行交换,也就是flag的值没有被改变的话,那就直接跳出循环

进行了交换的话直接条用输出函数打印出排序处理之后的列表数据

只进行了一次里循环的话只是直接吧大的数值往后面沉,也就是说相当于直接
把最大的数字直接取出来放到后面而已,实际上的数组的数据顺序除了最大的数值
其他是没有改变的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值