排序算法之冒泡排序(二)

本文深入探讨了冒泡排序算法的一种改进方法,通过每次选择最小值和最大值,分别放置在数组首尾,以期减少排序次数。然而,这种改进并未能实现完全排序,作者随后提出了新的思路,即每次让最大值与其后小于它的数交换,逐步将最大值推至末尾。文章附带了详细的代码示例和动画解释,帮助理解冒泡排序的工作原理。
摘要由CSDN通过智能技术生成

 图片参考:十大经典排序算法最强总结(含JAVA代码实现) - 郭耀华 - 博客园 (cnblogs.com)     

        上一篇文章讲到了如何去进行比较,选出最大值然后进行排序。

        接下来这一篇我们稍稍在对上一篇文章的排序方法进行一下改进。首先我们想一个问题,我既然能够从n个数中找出最大的一个数字,那我能不能从这些数字中找出最小最小的一个数字呢?答案是可以的,我们只需要每次选最大数改为选择最小数就好了呀。

        那我们继续向下考虑,我如果每次选择出最大值放在最后一位,把最小值放在第一位。然后重复这个操作那是不是最后我们就可以把整个数组排成有序的数列。有小伙伴可能问为啥要做这个改进呢?其实这个很简单,因为我们既然要遍历一遍那为什么不尽可能多的把位置固定好呢,上一篇我们每次都只是固定最后一位,那我们稍稍改进一下,我们是不是可以每次都固定两位,即第一位和最后一位呢,这样大家遍历的次数不就减少了一般吗?想想是不是很激动。

        话不多说上代码

#include <stdio.h>
#include <iostream>
#include <stdlib.h>
using namespace std;

void swap_1(int a[], int index1, int index2){
	int temp = a[index1];
	a[index1] = a[index2];
	a[index2] = temp;
}

void Print(int a[], int len_a){
	for(int i = 0; i < len_a; ++i){
		printf("%d ", a[i]);
	}
	printf("\n");
}


int BubbleSortAdvanced(int a[], int len_a){
	for(int i = 0; i < len_a/2+1; ++i){
		int min_number = a[i], max_number = a[i], flagmax = i, flagmin = i;
		for(int j = i; j < len_a-i; ++j){
			if(max_number < a[j]){
				max_number = a[j];
				flagmax = j;
			}
			if(min_number > a[j]){
				min_number = a[j];
				flagmin = j;
			}
		}
		swap_1(a, flagmin, i);
		swap_1(a, flagmax, len_a-i-1);
		
		//相当于Printf输出函数,不必纠结于此,对核心代码没有影响。 
		cout <<"flagmin: "<<flagmin
			 << " i: "      << i 
			 << " flagmax: " << flagmax
			 << " len_a-i-1: " << len_a-i-1 << endl; 
		
		Print(a, len_a);
	}
}

int main(){
	int a[10];
	for(int i = 0; i < 10; ++i){	//用于随机生成10个测试数据 
		a[i] = rand()%50+0;
	}
	printf("初始化的10个数据:\n"); 
	Print(a, 10);
	BubbleSortAdvanced(a, 10);
	return 0; 
}

         大家看一下代码发现并没有完成排序的你任务...难道是思路错了吗?每次选出一个最大一个最小,大的放最后边,小的放最前边不对吗?为什么代码不行呢?(欢迎大家留言讨论....明天公布原因,博主敲的时候也没想到会有这个坑,一直以为是自己代码写的不行...其实思路上是有点问题的, 也希望打搅想想为什么, 每次只取最大值的时候可以, 顺便取了最小值就不可以了呢?

        那既然这样不行我们要不然换个思路思考一下,路总是自己探索出来的,失败不可怕!!!

        我们这样想我们可不可以不再考虑每次选择出最大的那个然后拿出啦,而是让最大的这个数与在它后面但是比它小的数据进行交换呢?例如; 1,5,3。 1<5 不交换,但是5<3交换。所以变成了1,3,5。

        不懂?没事!!看下面的动画!!!

        有了这个思路,我们每次只要把最大的数字变换到最后就可以了。和上一篇思路一样最大的放到最后,但是现在不是直接和最后一个交换了,而是一次次比较过程中放到最后。

         动画很详细了。我就不多说了。上代码

#include <stdio.h>

void Print(int a[], int len_a){
	for(int i = 0; i < len_a; ++i){
		printf("%d ", a[i]);
	}
	printf("\n");
}

void BubbleSort(int a[], int len_a){
	for(int i = 0; i < len_a; ++i){
		for(int j = 1; j < len_a-i; ++j){
			if(a[j-1] > a[j]){
				int temp = a[j-1];
				a[j-1] = a[j];
				a[j] = temp;
			}
		}
		Print(a, len_a);
	}
} 

int main(){
	int a[10];
	for(int i = 0; i < 10; ++i){	//用于随机生成10个测试数据 
		a[i] = rand()%50+0;
	}
	printf("初始化的10个数据:\n"); 
	Print(a, 10);
//	BubbleSortAdvanced(a, 10);
	BubbleSort(a, 10);
	return 0; 
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值