算法学习日记1----基本排序1--冒泡排序

       排序是日常生活和工作中都需要的基本操作,尤其是对于计算机来说,排序的效率决定了代码的执行效率,对产品开发起到功不可没的作用!下面让我们来了解排序的最基本方法!

冒泡排序

       冒泡排序是我接触的第一种排序算法,下面简单介绍冒泡排序的过程。

       随便给出一个乱序的数组,下面我们将通过三种排序算法对同一个数组进行操作。使用size记录数组的元素个数,sizeof(arr)所求的是整个数组的字节数,除以sizeof(int),也就是整型数的字节数,求出元素个数。

       下面是冒泡排序的核心思想,如何体现冒泡的过程,换言之,就是冒泡排序为何叫“冒泡排序”,冒泡的过程就体现在数组元素的交换上,就比如我要升序排这个数组,那么大的数字就要从前往后,我们从第一个元素开始,每两个元素之间进行比较,将大的数置换到后面,操作如下。

       从第一个元素开始,我们发现arr[0]比arr[1]要小,满足升序条件,于是我们就不需要交换两个数值。当遍历到arr[1]时,我们发现arr[2]比arr[1]要小,对这两个数来说,不满足升序的要求,于是如上图交换两个数。类似的操作,我们遍历一整趟数组,可以发现,数组中最大的元素被移到了的最后    面,就像是几块石头,最重的石头沉得最深。             

       第一趟排序后,我们就找到了数组中的最大值,在最后一个位置。于是我们通过循环,每一次都同上操作,于是我们实现的过程就是每一趟找到未排序的数字的最大值,并将其排放到他应该在的位置,也就是符合升序要求的位置,数组的元素有十个,那么我们就要循环9趟,每一趟都能将一个值归位,而每一趟循环,我们都需要将每一个数字进行比较,冒泡排序,将不满足升序要求两个数字进行交换。

       重复上述操作后,我们发现,在第七趟排序结束后,产生的数组就已经符合升序要求了,这时就可以通过一定的操作跳出循环,避免浪费不必要的时间,下面是我写的源代码,其中count表示的是交换的次数,一定程度上可以表现出算法的复杂程度。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//实现冒泡排序
void swap(int* a, int* b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}
void displayarr(int* arr, int size)
{
	printf("the array is:");
	for (int i = 0; i < size; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}
void bubblesort(int* arr, int size)
{
	//算法的复杂度为O(n²)
	int count = 0;
	for (int i = 0; i < size - 1; i++)
	{
		int flag = 0;
		for (int j = 0; j < size - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				swap(&arr[j], &arr[j + 1]);
				flag = 1;
				count++;
			}
		}
		displayarr(arr, size);
		if (flag == 0)
		{
			break;
		}
	}
	printf("%d\n", count);
}
int main()
{
	int arr[] = { 4,45,34,5646,234,456,234,56,234,46 };
	int size = sizeof(arr) / sizeof(int);
	//冒泡排序
	printf("----------------------------------\n");
	printf("bubblesort:\n");
	printf("the first array is:\n");
	displayarr(arr, size);
	printf("\n");
	bubblesort(arr, size);
	displayarr(arr, size);
	printf("----------------------------------\n");
	return 0;
}

       本人刚上大一,希望能通过写博客提升自己的能力,感谢大家的支持,我也会不断努力,最后希望如果有不正确的地方可以指出,我会改正。谢谢大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值