(C++)数据结构排序---冒泡排序

冒泡排序是一种最简单的排序算法。

基本思想:对于一组数据,从第一个开始,与其右边相邻数据作比较。若a[i]>a[i+1],则两个数据互换位置,该方法是把数据由小到大排列;如果要把数据从大到小排列,则a[i]<a[i+1]时,交换数据位置。若有n个数据,一共需要经过n-1趟比较,第一次需要比较n-1次,每趟得到一个数据的位置。

上述方法中,供需比较次数为:(1+n-1)*(n-1)/2=n*(n-1)/2。

该方法存在一个弊端,即当给定数组为有序时,算法依然需要比较n*(n-1)/2次。我们可以给定一个标识符,当数据交换位置时,继续下一趟比较;当一趟比较后发现没有发生数据交换,说明已经完成排序。故此时,最好的情况时比较(n-1)次,发现数据为有序的。该方法需要一个记录的辅助空间。

该冒泡方法:

平均情况的时间复杂度          最好情况的时间复杂度               最坏情况的时间复杂度         空间复杂度

         O(n^2)                                 O(n)                                        O(n^2)                        O(1)

代码实现如下:

#ifndef _BUBBLE_H
#define _BUBBLE_H
#include<iostream>
using namespace std;
// 当第i趟循环中,没有发生交换,排序已经完成,排序结束
//所以冒泡排序在最好情况下,进行n次比较,时间复杂度为O(n) 
template<typename Type>
void Bubble(Type* a,int n)
{
	bool flag;
	Type tem;
	for(int i=0;i<n-1;i++)
	{
		flag=false; //数组内数据是否变换位置的标志 
		for(int j=0;j<n-1-j;j++)
		{
			if(a[j]>a[j+1])
			{
				tem=a[j];
				a[j]=a[j+1];
				a[j+1]=tem;
				flag=true;
			}	
		}
		if(!flag)//如果flag==false,即数组内数据没有变换位置 
		break;
	}
}
#endif 

另一种编程方法

#ifndef _BUBBLE_H
#define _BUBBLE_H
#include<iostream>
using namespace std;
template<class Type>
 void Bubble(Type a[],int n)
 {
 	bool exchange=true;
 	int i=1;
 	Type tem;
 	while(exchange)
 	{
 		exchange=false;
 		for(int j=0;j<n-i;j++)
 		{
 			if(a[j]>a[j+1])
 			{
 				tem=a[j];
 				a[j]=a[j+1];
 				a[j+1]=tem;
 				exchange=true;
			 }
		}
                i++;
	 }
  } 
#endif

测试代码:

#include<iostream>
#include"Bubble.h"
using namespace std;
int main()
{
	int a[10]={18,23,15,3,8,54,12,54,76,100};
	for(int i=0;i<10;i++)
	cout<<a[i]<<" ";
	cout<<endl;
	Bubble(a,10);
	for(int i=0;i<10;i++)
	cout<<a[i]<<" ";
	cout<<endl;
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
排序是对一组数据按照某种规则进行排列的算法。在C++中,有多种排序算法可以使用。 其中几个常见的排序算法包括选择排序(Selection sort)、冒泡排序(Bubble sort)、希尔排序(Shell sort)和归并排序(Merge sort)。 选择排序是一种简单直观的排序算法,它的工作原理是每次找出第i小的元素,并将这个元素与数组第i个位置上的元素交换。选择排序的时间复杂度为O(n^2),其中n是待排序数组的大小。 冒泡排序是另一种简单的排序算法,它的工作原理是通过相邻元素的比较和交换来将较大的元素逐渐“冒泡”到数组的末尾。冒泡排序的时间复杂度也是O(n^2)。 希尔排序是一种改进的插入排序算法,它通过将整个待排序序列分割成若干个子序列来进行排序,最后再对整个序列进行一次插入排序。希尔排序的时间复杂度为O(n^(3/2)),性能较好。 归并排序是一种分治策略的排序算法,它的工作原理是将待排序序列分成两个子序列,分别对子序列进行递归排序,然后再将已排序的子序列合并成一个有序序列。归并排序的时间复杂度为O(nlogn),具有稳定性。 根据您提供的代码,第一个部分是希尔排序的实现代码,第二个部分是选择排序的实现代码。您可以根据自己的需求选择其中一种排序算法来进行排序。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C++ 数据结构与算法 (十一)(排序算法)](https://blog.csdn.net/qq_19887221/article/details/124198104)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值