1、稳定排序一—— 冒泡排序

img

稳定排序:冒泡、插入、归并

不稳定排序:快排、选择、写入、堆

1、冒泡排序
  • 相邻元素两两比较,如果左边比右边大,就交换;否则不变,继续比较下一个相邻元素。每趟可以确定一个元素,经过n-1趟即可完成排序

  • 稳定性:因为两个元素相等时 不会交换,所以相对位置不变,是稳定排序

  • 时间复杂度 o(n^2) ,空间 o 1, 原地算法,稳定

  • 代码:

  //i是比较的趟数,j是元素的下标
  void bubbleSort(vector<int>& a, int n) {
  	for (auto i = 0; i < n-1; ++i) { //n-1趟
  		for (int j = 0; j < n - i - 1; ++j) { //这一趟中参与比较的元素(上次确定的不用比了)
  			if (a[j] > a[j + 1])
  				swap(a[j], a[j + 1]);
  		}
  	}
  }
  • 优化(如果在这一趟中没有元素发生交换,说明已经排好序了,此时就可以结束冒泡了)

void bubbleSort2(vector<int>& nums) {   	
		int len = nums.size();  
    	bool flag = false;   	
    	for (int i = 0; i < len-1; ++i) //n-1趟
        {
      		flag = false;//每一趟开始时,都是标记为false,表示没发生交换
      		
      		for (int j = 0; j < len - 1 - i; ++j) //遍历元素,j指向左边的元素
             {
      			if (nums[j] > nums[j + 1]) 
                  { 
      				flag = true;//如果交换了,就标记为true
      				swap(nums[j], nums[j + 1]); //交换
      			  }
      		}
      		
      		if (!flag)//说明没有交换,则表明[0,len-i-1]已经是有序的了
      			break;   	
      	}   
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值