C:八种基本排序——冒泡排序(1)

45 篇文章 2 订阅
10 篇文章 0 订阅
冒泡排序

原理:
比较两个相邻的元素,将值大的元素交换到右边

思路:
依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面。(按照从小到大排序)

  1. 第一次比较:首先比较第一和第二个数,将小数放在前面,将大数放在后面。
  2. 比较第2和第3个数,将小数放在前面,大数放在后面。
  3. 如此继续,直到比较到最后的两个数,将小数放在前面,大数放在后面,此时第一趟排序完成。
  4. 继续重复上述过程,除了最后一个。 在上面一趟比较完成后,最后一个数一定是数组中最大的一个数,所以在比较第二趟的时候,最后一个数是不参加比较的。
  5. 在第二趟比较完成后,倒数第二个数也一定是数组中倒数第二大数,所以在第三趟的比较中,最后两个数是不参与比较的。
  6. 依次类推,每一趟比较次数减少依次,直到没有任何一对数字需要比较。

图解冒泡排序:
在这里插入图片描述

算法分析:

  1. 由此可见:N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-i)次,所以可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数
  2. 冒泡排序的优缺点:
    优点:比较简单,空间复杂度较低,是稳定的;
    缺点:时间复杂度太高,效率慢;
  3. 时间复杂度
    (1).如果我们的数据正序,只需要走一趟即可完成排序。所需的比较次数C和记录移动次数M均达到最小值,即:Cmin=n-1;Mmin=0,所以,冒泡排序最好的时间复杂度为O(n)。
    (2).如果很不幸我们的数据是反序的,则需要进行n-1趟排序。每趟排序要进行n-i次比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:
    在这里插入图片描述
    冒泡排序的最坏时间复杂度为O(n^2) 。
    综上所述:冒泡排序总的平均时间复杂度为:O(n^2)
算法稳定性

排序算法的稳定性大家应该都知道,通俗地讲就是能保证排序前两个相等的数据其在序列中的先后位置顺序与排序后它们两个先后位置顺序相同。即:如,如果A i == A j,Ai 原来在 Aj 位置前,排序后 Ai 仍然是在 Aj 位置前。
冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变。
综上所述:
冒泡排序是一种稳定排序算法。

C代码实现:

#include <stdio.h>
#include <stdlib.h>

//冒泡排序函数
void bubbleSort(int arr[], int sz){
	int i, j ,tmp;
	for (i = 0; i <= sz - 1; i++){	//冒泡的趟数
		int flag = 1;
		for (j = 0; j < sz - 1 - i; j++){
			if (arr[j]>arr[j + 1]){
				flag = 0;
				tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
		if (flag == 1)//如果某趟顺序已经排好,则直接跳出
			break;
	}
}

//打印函数
void printArr(int arr[], int sz){
	int i;
	for (i = 0; i < sz; i++){
		printf("%d ", arr[i]);
	}
	printf("\n");
}

int main(){
	int arr[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
	int sz = sizeof(arr) / sizeof(arr[0]);//得到数组的长度
	int i = 0;

	printArr(arr, sz);
	bubbleSort(arr, sz);
	printArr(arr, sz);

	system("pause");
	return 0;
}

代码生成图:
在这里插入图片描述


如有不同见解,欢迎留言!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值