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;
}