冒泡排序(BubbleSort)和计数排序(CountSort)

目录

冒泡排序(BubbleSort)

模拟算法

代码

计数排序(CountSort)

代码 

说明 


冒泡排序(BubbleSort)

每一轮一次交换相邻两个元素,使最大的元素放到队尾,因似气泡在水中浮起,所以名叫冒泡排序

最好情况的时间复杂度:O(n)

最坏情况的时间复杂度:O(n^2)

平均时间复杂度:O(n^2)

空间复杂度:O(1)

稳定性:稳定

模拟算法

先列举一个数组:

 5    3    4    6    1    2

一次交换后:

3    4    5    1    2    6

两次交换后:

3    4    1    2    5    6

三次交换后:

3    1    2    4    5    6

四次交换后:

1    2    3    4    5    6

五次运行后发现无交换,所以排列有序,结束。

代码

for (int i = 1; i <=n-1; i ++ )
{//控制每次循环的次数
        for (int j = 1; j <= n-i; j ++ )
		{//从前往后比较相邻两个元素 
            if (a[j] > a[j + 1])
            {//如果前面的大于后面的 
                swap(a[j],a[j+1]);//交换
            }
        }
    }
}

优化后的代码:

for (int i = 1; i <=n-1; i ++ )
{//控制每次循环的次数
    bool flag =false; 
    for (int j = 1; j <= n-i; j ++ )
	{//从前往后比较相邻两个元素 
        if (a[j] > a[j + 1])
		{//如果前面的大于后面的 
            swap(a[j],a[j+1]);//交换 
            flag=true;
        }
    }
    if(!flag) break;//如果无交换,则说明数组有序,无需继续
}

 

计数排序(CountSort)

输入待排序的数组后,将其按照数字范围定义的数组下标加一,最后按顺序输出数组(下标为几就输出几个)

时间复杂度:O(n+k)

空间复杂度:O(k)

稳定性:稳定

代码 

for(int i=1;i<=n;i++)
{
	int k;
	cin>>k;//输入待排序列中的值
	b[k]++;//将数组b中下标k的元素值加1
}
for(int i=0;i<=100;i++)//数组b按照下标由小到大访问
{
	while(b[i]>0)//如果第i个元素的值不为0,则输出下标i
	{
		cout<<i<<' ';
		b[i]--;
    }
}

说明 

当数列最大最小值差距过大时,并不适用于计数排序

当数列元素不是整数时,并不适用于计数排序

因此计数排序并不适用于大部分情况。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值