#include<iostream>
#include<vector>
using namespace std;
//冒泡排序
//每一趟从前往后两两比较,最终都会有一个最大的元素冒出来并放在最终的序列位置上,而且它们在同一端连续有序
//如果已经基本有序,则不需要移动
//时间复杂度:O(n^2)
//稳定排序算法
void sort1(vector<int> &vec)
{
for (int i = vec.size() - 1; i >= 1; i--)
{
for (int j = 0; j <= i-1; j++)
{
if (vec[j] > vec[j+1])
{
int temp = vec[j + 1];
vec[j + 1] = vec[j];
vec[j] = temp;
}
}
}
}
void Swap(int &a,int &b)
{
int temp = a;
a = b;
b = temp;
}
int PartExchange(vector<int> &vec, int low, int high)
{
int key_value = vec[low];
while (low < high)
{
while (low < high && key_value <= vec[high]) // 从右向左找第一个小于key_value的数,并交换这两个值
high--;
Swap(vec[low], vec[high]);
while (low < high && key_value >= vec[low]) // 从左向右找第一个大于key_value的数,并交换这两个值
low++;
Swap(vec[low], vec[high]);
}
return low; //返回key_value的下标
}
void Qsort(vector<int> &vec, int low, int high)
{
if (low < high)
{
int key=PartExchange(vec, low, high);
Qsort(vec, low, key - 1);
Qsort(vec, key, high);
}
}
//快速排序
//1.每次总以当前表中第一个元素为基准,对表进行划分,比基准大的向右移动,比基准小的向左移动;
//2.分别对字表进行第一步操作,直至每个字表只有一个元素或为空;
//3.合并字表。
//特点:每一趟都会有一个元素即(基准)放在最终的位置上,而且左边全部小于它,右边全部大于它,但不一定连续有序,也不一定在一端上。
//理想情况下:每次划分后两边对称即正好将分成两个等长的子序列
//最坏情况下:基本有序或基本逆序即每次划分,只得到一个子序列,快排序反而蜕化为冒泡排序
//时间复杂度:O(nlogn)
//不稳定排序算法
void sort2(vector<int> &vec)
{
Qsort(vec, 0, vec.size() - 1);
}
int main()
{
vector<int> vec = { 3,7,5,8,2,1,9,4,6 };
for (unsigned int i = 0; i <= vec.size() - 1; i++)
{
cout << vec[i] << " ";
}
cout << endl;
sort1(vec);
for (unsigned int i = 0; i <= vec.size() - 1; i++)
{
cout << vec[i] << " ";
}
system("pause>nul");
return 0;
}
交换排序算法
最新推荐文章于 2023-06-16 17:58:54 发布