交换:根据数据之间的比较,把每个数据都放在自己应该的位置
(1)冒泡排序:通过不断的比较两个相邻的元素,若这两个元素是乱序的,则交换位置。从而实现每趟都把最大的数据交换到最后面
时间复杂度:O(n^2)
是否稳定:稳定
为就地排序
(2)快速排序:首先选定一个基准数(比较的标准),把比基准数x小的数据放在x前面,比基准数x大的数据放在后面。排好一趟后,x把序列划分为了两部分,这两部分还都是乱序的,再分别对这两部分进行快速排序。//递归
选择基准数(排序区间[l.r]):理论上谁都可以
(1)选择排序区间第一个 a[l]----为例
1.两个下标i=l,j=r;相对遍历
2.先用j找一个比x小的数,放在i位置,i++
3.再用i找一个比x大的数,放在j位置,j--
4.不断循环,直到i==j为止,此时i/j位置就是x的位置
5.然后再对x前后两个区域进行递归调用
(2)选择排序区间最后一个 a[r]
(3)选择排序区间中间位置 a[(l+r)/2]
时间复杂度:O(nlogn)
是否稳定:不稳定
为就地排序
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
using namespace std;
//left和right分别为排序区间范围
void Quick_Sort(vector<int>(&v), int left, int right)
{
int i(left);
int j(right);
//递归出口,即排序区间只有一个元素时不进行排序
if (left < right)
{
int x(v[i]);
//排序
while (i < j)
{
while (i < j && v[j] > x)
{
j--;
}
if (i < j)
{
v[i] = v[j];
i++;
}
while (i < j && v[i] < x)
{
i++;
}
if (i < j)
{
v[j] = v[i];
j--;
}
}
v[i] = x;
//递归调用,以v[i] = x为基准
Quick_Sort(v, left, i - 1);
Quick_Sort(v, i + 1, right);
}
//选取区间第一个作为基准数
}
void Quick_Sort_2(vector<int>(&v),int left,int right)
{
int i(left);
int j(right);
//递归出口,即排序区间只有一个元素时不进行排序
if (left < right)
{
int x(v[j]);
//排序
while (i < j)
{
while (i < j && v[i] < x)
{
i++;
}
if (i < j)
{
v[j] = v[i];
j--;
}
while (i < j && v[j] > x)
{
j--;
}
if (i < j)
{
v[i] = v[j];
i++;
}
}
v[i] = x;
//递归调用,以v[i] = x为基准
Quick_Sort(v,left,i-1);
Quick_Sort(v,i+1,right);
}
//选取区间最后一个作为基准数
}
void Bubble_Sort(vector<int>(&v))
{
int tmp(0);
//枚举趟数
for (int i = 0; i < v.size() - 1; ++i)
{
//记录乱序区是否发生交换
bool flag(false);
//遍历乱序区
for (int j = 0; j < v.size() - 1 - i; ++j)
{
if (v[j] > v[j + 1])
{
flag = true;
tmp = v[j];
v[j] = v[j + 1];
v[j + 1] = tmp;
}
}
if (flag == false)
{
break;
}
}
}
int main()
{
vector<int> v;
int n(0);
cin >> n;
v.resize(n);
for (auto& a : v)
{
cin >> a;
}
Quick_Sort_2(v,0,v.size()-1);
for (auto a : v)
{
cout << a << ' ';
}
return 0;
}
/*
6
30
20
10
60
50
40
*/