交换排序欧

1.1 冒泡排序

【算法步骤】
①趟数,n个数需要比较n-1趟
②每趟比较的次数,m趟比较n-m次
③比较过程中,发现前比后大,交换。
提高效率:某一趟没有出现交换记录,说明已经排好序了,就不再比较排序,结束算法了。
解决:就是用个flag表示一趟是否有交换,发生交换置为1,没有交换置为0

#include<iostream>
#include<vector>
#include <algorithm>
using namespace std;

void bubble_sort(vector<int>& v)
{
	int n = v.size();
	int m;
	int flag = 1;
	for (m=0; m <n-1&&flag==1; m++)//多少趟
	{
		flag = 0;//每次进来flag都置为0,然后有两种情况
		         //①符合if置为1,又进入循环再来;②置为0后,不符合if,也就是跳出整个for      
		        //因为比较了交换顺序了才有flag=1,因此说明这趟交换了,还没有比到低,继续比较。
		        //相反为0,说明这趟没有交换,也就是已经有序了,因此跳出循环结束
		for (int j = v.size(); j >= m; j--)  //每一趟比多少次   好像是这样回事,如果nm同时为0时,j<负数,直接跳出循环
		{//顺着不行,倒着来,学到起
			//当第0趟,要比5次  而j为4,j>=0,比的是4-0+1次。
			//第1趟,要比4次,j>=1,比的是4-1+1=4
			//2趟,4-2+1=3  
			//这些东西自己捋出来的比课本上的好得多         
			if (v[j] > v[j + 1])//每次怎么比
				swap(v[j], v[j + 1]);
		}
			             
	}
}
int main()
{
	vector<int> v{ 0,-1,100,87,200,4 };
	bubble_sort(v);
	for (auto x : v)
		 cout << x << ' ';
   system("pause");
   return 0;
}

1.2 快速排序

【算法步骤】
找一个数作为基准,所有小于关键字的放在左边,所有大于关键字的放在右边。
①定义两个指针,移动右指针,如果右指针指向的值比基准大,往前找一找。其余情况就是,找到比它小的,将right的值赋给left,然后左边left指针行动;左指针同理。(左右对称的意思)

#include<iostream>
#include<vector>
#include <algorithm>
using namespace std;
//找中心点的位置
int Partition(vector<int>& v, int left, int right)
{
	int pivot = v[left];//将第一个作为标准
	while (left <right)
	{
		if (left < right && v[right] >= pivot)//后面找大的           ??、/、
			right--;
		v[left] = v[right];//比它小的放在其左边,右边就空出位置了
		if (left < right&&v[left] <= pivot)
			left++;
		v[right] = v[left];
	}
	v[left] = pivot;  //最后还要把基准放回每趟排好的那个left去(最后left与right指向一起的位置)
	return left;
}
//首先是整个数组,第二次是分成两个子表,第三次是分成四个子表
//这样递归,也就是下面的quicksort

void quickSort(vector<int> &v, int left, int right)
	{
		int temp;
		if (left < right)//长度大于1
		{
			temp = Partition(v, left, right);
			quickSort(v, left, temp- 1);  //对低子表递归排序
			quickSort(v,temp+1, right);
		}
}
int main()
{
	vector<int> v{ 0,-1,100,87,200,4 };
	int size = v.size() - 1;   //tm直接v.size()不行,报错是expression:vector subscript out of range下标,实际是上标写成size了
	quickSort(v,0,size);        //根本就没有那么多数,来自网友比如你的vector只有5个元素,你却用下标访问第6个或者-1个都会造成这个错误
	for (auto x : v)
		cout << x << ' ';
	system("pause");
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值