冒泡排序的讲解与一些使用案例的解析

本文详细介绍了冒泡排序的基本原理,包括其从左到右比较相邻元素的过程,以及如何通过C语言实现冒泡排序算法。同时,还展示了如何使用冒泡排序的思想解决整数去重问题。
摘要由CSDN通过智能技术生成

目录1.冒泡排序

2.冒泡排序的使用

冒泡排序的原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来,冒出来后,也就完成了一小步。

​编辑代码如下

 

运行结果如下​编辑


冒泡排序的原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来,冒出来后,也就完成了一小步。

以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一轮一轮地比较,最后实现从小到大排序。

代码如下

#include<stdio.h>
void Bubble_sort(int arr[], int size)//int arr[]等价于int *arr
{
	int j,i;
	for (i = 0; i < size-1;i ++)//size-1是因为不用与自己比较,所以比的数就少一个
	{
		int count = 0;
		for (j = 0; j < size-1 - i; j++)	//size-1-i是因为每一趟就会少一个数比较
		{
			if (arr[j] > arr[j+1])//这是升序排法,前一个数和后一个数比较,如果前数大则与后一个数换位置
			{
				int tem = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = tem;
				count = 1;
				
			}
		}
		if (count == 0)			//如果某一趟没有交换位置,则说明已经排好序,直接退出循环
				break;	
	}
 
}
int main()
{
	int arr[10];
	int i;
	
	printf("请输入10个数\n");
	for (i = 0; i < 10; i++)		
	{
		scanf("%d", &arr[i]);
	}
	printf("排序前的数组>");
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
 
	printf("\n排序后的数组>");
	Bubble_sort(arr, 10);
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
 
	return 0;
}
  •  


    运行结果如下



    1.有序序列判断_牛客题霸_牛客网 (nowcoder.com)大致思路就是:对一个已经输入的数组,进行三部判断(1.是否为升序,2.是否为降序,3.改数组是否为一个常数数组)三者只要符合其中一种那么就是一个有序数组;

  • 我是采用的函数的写法,这是代码的一部分,那么函数部分我很是不是可以使用与冒泡排序的原理实现呢?
    int main() {
        int arr[100] = { 4, 4, 4, 4 }, b = 4, i = 0;
        scanf("%d", &b);
        for (i = 0; i < b; i++) {
            scanf("%d", &arr[i]);
        }
        bu(arr, b);
        return 0;
    }

 1.判断是否为升序

int flag = 0;
    for (j = 0; j < sz - 1; j++) { //判断是否为升序
        if (p[j] < p[j + 1])//判断是否为升序
        {
            flag = 1;
        } else//发现有的地方不符合升序条件
        {//即也就是本数组部位升序数组
            flag = 0;
            break;//直接跳出本次判断是否为升序的判断
        }
    }
    if (flag == 1) 
    {
        goto again;//为了实现满足上述三者情况的一种即可
    }

2.判断是否为降序

int flag = 0;
for (j = 0; j < sz - 1; j++)//判断是否为降序
     {
        if (p[j] > p[j + 1])//判断相邻两项是否为降序
        {
            flag = 2;
        } else //发现不符合降序的情况
        {
            flag = 0;
            break;//直接跳出本次判断
        }
    }
    if (flag == 2)
    {
        goto again;//为了实现满足上述三者情况的一种即可
    }

3.判断是否为常数数组

    for (j = 0; j < sz - i - 1; j++)//比较是否为常数数组
     { 
        if (p[j] < p[j + 1])
        {
            fla = 0;
        }
    }
    if (fla == 1) 
    {
        flag = 1;//为了实现满足上述三者情况的一种即可
    }

三种情况我们全都已经实现,哪么我们只需要书写剩余的简单部分即可


全部代码如下

#include<stdio.h>
void bu(int* p, int sz) {
    int i = 0, j = 0;
    int flag = 0;
    for (j = 0; j < sz - 1; j++) { //判断是否为升序
        if (p[j] < p[j + 1])
        {
            flag = 1;
        } else
        {
            flag = 0;
            break;
        }
    }
    if (flag == 1) 
    {
        goto again;
    }
    for (j = 0; j < sz - 1; j++)
     { //降序
        if (p[j] > p[j + 1])
         {
            flag = 2;
        } else {
            flag = 0;
            break;
        }
    }
    if (flag == 2)
     {
        goto again;
    }
    int fla = 1;
    for (j = 0; j < sz - i - 1; j++)//比较是否为常数数组
     { 
        if (p[j] < p[j + 1])
        {
            fla = 0;
        }
    }
    if (fla == 1) 
    {
        flag = 1;
    }
again:
    if (flag == 1 || flag == 2) {
        printf("sorted\n");
    } else {
        printf("unsorted\n");
    }
}
int main() {
    int arr[100] = { 4, 4, 4, 4 }, b = 4, i = 0;
    scanf("%d", &b);
    for (i = 0; i < b; i++) {
        scanf("%d", &arr[i]);
    }
    bu(arr, b);
    return 0;
}


题目2序列中整数去重_牛客题霸_牛客网 (nowcoder.com)

上一个题冒泡排序体现的不明显,那么我们再看一题

 思路就是跟冒泡排序简直一模一样,同样两层循环,外层为趟数,内层为比较

#include <stdio.h>

int main() {
    int a,arr[100],arrr[100];
    scanf("%d",&a);
    int i=0;
    for(i=0;i<a;i++){
        scanf("%d",&arr[i]);
    }
    for(i=0;i<a;i++)//趟数
    {
        int j=0;
        for(j=i+1;j<a;j++)
        {
            if(arr[i]==arr[j])//查重
            {
                arr[j]=0;//令重复的数为0,以便后面打印
            }
        }
    }
    for(i=0;i<a;i++)
    {
        if(arr[i]!=0)//将重复的不再打印
        printf("%d ",arr[i]);
    }
    return 0;
}

总而言之冒泡排序就是从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来,冒出来后,也就完成了一小步。

在c语言中冒泡排序很重要,我们不仅要掌握,还需要会使用他的思路;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值