排序算法--冒泡排序

1.基本思想:每次比较两个相邻的元素,如果顺序错误,则交换这两个元素的位置。

例如:对5,3,4,9,6这五个数按从小到大排序。
第一趟排序:先比较第一位数5和第二位数3,则发现顺序错误,故进行交换,交换后则变为3,5,4,9,6,接下来继续比较第二位(5)与第三位(4)……一直到第四位与第五位比较。第一趟排序后最大的数9排在最后。
第二趟排序:依次两两比较,直到第三位与第四位比较完。第二趟排序后6排在倒数第二位。
……

2.规律总结
。每趟排好一个数,排好的数依次放在倒数第一位、倒数第二位……
。n个数进行一次排序的比较次数为n-1

3.代码:
#include<iostream>

using namespace std;

int bubble_sort(int a[], int len)
{
    int flag; 
    int temp;
    for (int i = 0; i < len-1; i++) 
    {	
        flag = 0; //标记本趟排序是否发生交换
        for (int j = 0; j < len - 1 - i; j++)  //每一趟排好一个数,每一趟排序后减去1,则i趟排序后减去i,故为len - 1 - i
        {
            if (a[j] > a[j + 1])    
            { 
                temp = a[j];   //记录次数
                a[j] = a[j + 1];
                a[j + 1] = temp;
                flag = 1;
            }
            if (flag == 0) //一趟排序没有发生交换,则说明序列是有序的
                return 0;
        }
    }

	return 0;
}

int main()
{
	int a[] = {5, 3, 4, 9, 6};
	
	bubble_sort(a,5);

	for (int j = 0; j < 5; j++)  //输出排序后的数
	{
		cout << a[j] << " ";
	}

	return 0;
}
4.算法时间复杂度分析:

假设待排序的数组共有n个关键字,分最好情况和最坏情况讨论。
(1)若待排序的数组初始状态是正序的,则不需要排序,只需一趟就可完成排序。关键字的比较次数C和移动次数M分别为n-1和0。故最好情况下时间复杂度为O(n)。
(2)若待排序的数组初始状态是反序的,则需要进行(n-1)趟排序,每趟排序需要进行(n-i)次关键字比较,而每次比较都需记录三次移动(见代码注释记录移动处)。这种情况下比较和移动次数都为最大值:
比较次数C=n(n-1)/2=O(n^2)
移动次数M=3n(n-1)/2=O(n^2)
综上所述,冒泡排序总的平均时间复杂度为(n^2)。

注:
1.(n^2)表示n的平方。
2.时间复杂度概念,参见百度百科

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值