C语言&冒泡排序的具体实现

11 篇文章 3 订阅

1.冒泡排序的具体讲解

1.引入

冒泡排序是C语言语言入门的算法之一,是很多刚接触C语言的朋友们必学或者必接触的一个算法

在这里插入图片描述

2.引入某百科:冒泡排序算法的运作

1.比较相邻的元素。如果第一个比第二个大,就交换它们两个。
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
5.由于它的简洁,冒泡排序通常被用来对于程序设计入门的学生介绍算法的概念。

3.引入某百科:对于冒泡排序的叙述

冒泡排序(英语:Bubble Sort)又称为泡式排序,是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。(看三遍再看下面的内容)

4.引入某百科:冒泡排序的进阶讲解

冒泡排序对N个项目需要O(n^2).的比较次数,且可以原地排序。尽管这个算法是最简单了解和实现的排序算法之一,但它对于包含大量的元素的数列排序是很没有效率的。

冒泡排序是与插入排序拥有相等的渐近时间复杂度,但是两种算法在需要的交换次数却很大地不同。在最坏的情况,冒泡排序需要O(n^2)次交换

而插入排序只要最多O(n)次交换。冒泡排序的实现通常会对已经排序好的数列拙劣地执行(O(n^2)),而插入排序在这个例子只需要 O(n)个运算。因此很多现代的算法教科书避免使用冒泡排序,而用插入排序取代之。冒泡排序如果能在内部循环第一次执行时,使用一个旗标来表示有无需要交换的可能,也可以把最优情况下的复杂度降低到O(n)。在这个情况,已经排序好的数列就无交换的需要。若在每次走访数列时,把走访顺序反过来,也可以稍微地改进效率。有时候称为鸡尾酒排序,因为算法会从数列的一端到另一端之间穿梭往返

2.冒泡排序的具体实现

1.创建一个数组,放上10个元素,求出数组元素的个数

int main()
{
	int arr[] = { 9,4,5,3,6,2,8,7,1,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);//求被排序数组的个数
	return 0;
}

2.把需要排序的数组和元素个数传递给bubble sort函数

void bubble_sort(int arr[] , int sz)
{

}

int main()
{
	int arr[] = { 9,4,5,3,6,2,8,7,1,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);//元素个数
	bubble_sort(arr,sz);
	return 0;
}

3.开始外层的循环,外循环为排序躺数,sz个数进行sz-1趟

void bubble_sort(int arr[],int sz)
{
	int i = 0;
	for (i = 0; i <= sz - 1; i++)/*排序的躺数*/
	{
	}
}

4.开始内层的循环,内循环为每趟比较的次数,第i趟比较sz-i次

/*内层排序:每一趟排序的次数*/
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{	
		/*判断是否交换两个相邻的元素*/
		if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}

5.如果是有序数组

void bubble_sort(int arr[],int sz)
{
	int i = 0;
	for (i = 0; i <= sz - 1; i++)/*排序的躺数*/
	{
		int flag = 1;/*假设已经有序*/

		/*每一趟排序的次数*/
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				flag = 0;/*不是有序数组的flag就为0*/

				/*交换*/
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
		/*内循环一趟过后,flag不为0,就说明没有交换,就是有序的,直接break*/
		if (flag == 1)
		{
			break;
		}
	}
}

3.全部代码

#include<stdio.h>


void bubble_sort(int arr[],int sz)
{
	int i = 0;
	for (i = 0; i <= sz - 1; i++)/*排序的躺数*/
	{
		int flag = 1;/*假设已经有序*/

		/*每一趟排序的次数*/
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				flag = 0;/*不是有序数组的flag就为0*/

				/*交换*/
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
		/*内循环一趟过后,flag不为0,就说明没有交换,就是有序的,直接break*/
		if (flag == 1)
		{
			break;
		}
	}
}

int main()
{
	int arr[] = { 9,4,5,3,6,2,8,7,1,10 };

	int sz = sizeof(arr) / sizeof(arr[0]);

	bubble_sort(arr,sz);

	for (int i = 0; i < sz; i++)
	{
		printf("%d ", i);
	}

	return 0;
}

4.更规范的冒泡排序

#include <stdio.h>
#include <stdbool.h>

#define ARR_LEN 255 /* 数组长度上限*/
#define elemType int /* 元素类型 */

/* 冒泡排序 */
/* 1.从当前元素起,向后依次比较每一对相邻的元素,逆序则交换
   2.对所有元素重复以上的步骤,直至最后一个元素
/* elemType arr[]: 排序目标数组; int len: 元素个数 */
void bubbleSort(int arr[], int len)
{

	int i, j, temp;
	_Bool exchanged = true;

	for (i = 0; exchanged && i < len - 1; i++) { /* 外循环为排序躺数,len个数进行len-1趟,只有交换过,exchanged的值为true才有必要执行循环,否则exchanged的值为false不执行循环 */
		exchanged = false;
		for (j = 0; j < len - 1 - i; j++)
		{ /* 内循环为每趟比较的次数,第i趟比较len-i次*/
			if (arr[j] > arr[j + 1])
			{ /* 相邻元素比较,如果逆序就交换(升序为左大右小,逆序反之) */
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
				exchanged = true; /*只有数值互换过, exchanged才会从false变成true,否则数列以及排序完成,exchanged的值任然为false,没必要排序 */
			}
		}
	}
}

int main() {
	int arr[ARR_LEN] = { 3,5,1,-7,4,9,-6,8,10,4 };
	int len = 10;
	int i;

	bubbleSort(arr, len);

	for (i = 0; i < len; i++)
		printf("%d\t", arr[i]);
	putchar('\n');

	return 0;
}

5.C++冒泡排序的实现

C++类模板的冒泡排序

#include<iostream>
using namespace std;

template<typename T>
void bubblesort(T arr[], int n)
{
	bool done = 0;
	for (int i = 1; i < n && !done; i++)
	{
		done = 1;
		for (int j = 1; j <= n - 1; j++)
			if (arr[j - 1] > arr[j])
		{
				T temp = arr[j - 1];
				arr[j - 1] = arr[j];
				arr[j] = temp;
				done = 0;
		}
	}
}

int main()
{
	int const len = 20;
	int i = 0, n = 0, a[len];
	cout << "被排序元素的个数 = ";
	cin >> n;
	cout << "输入" << n << "个元素";
	for (i = 0; i < n; i++)
	{
		cin >> a[i];
	}
	bubblesort(a, n);
	for (i = 0; i < n; i++)
	{
		cout << a[i] << " ";
		cout << " ";
	}

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值