快速选择算法:
【
#include <iostream>
#include "windows.h"
#include <vector>
#include <algorithm>
void Swap(vector <int>& arr, int i, int j)
{
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
int Partition(vector <int>& arr, int left, int right)
{
///以arr[right]作为划分基准 ----快速掌握看法:看返回的j的索引如何变的
int j = left - 1;
for (int i = left; i < right; i++)
{
if (arr[i] <= arr[right])
Swap(arr, i, ++j);
for (auto value : arr)
{
std::cout << value << " ";
}
}
Swap(arr, ++j, right);
for (auto value : arr)
{
std::cout << value << " ";
}
return j;
/* 以arr[left]作为基准 */ --快速掌握看法:看返回的left的索引是如何变的
int val = arr[left];
while (left < right)
{
while (left < right && arr[right] >= val)
right--;
arr[left] = arr[right];
for (auto value : arr)
{
std::cout << value << " ";
}
std::cout << "" << std::endl;
while (left < right && arr[left] <= val)
left++;
arr[right] = arr[left];
for (auto value : arr)
{
std::cout << value << " ";
}
std::cout << "" << std::endl;
}
arr[left] = val;
for (auto value : arr)
{
std::cout << value << " ";
}
return left;
}
int main()
{
std::vector<int> vecTestgg{ 4,1,2,5,6,7,8,6,5 ,100,200,300,45,66,42,17,89,65,33,15,24 };
for (auto value : vecTestgg)
{
std::cout << value << " ";
}
std::cout << "-------------------------------------" << endl;
int nLeft = 0;
int nRight = vecTestgg.size() - 1;
int hh = Partition(vecTestgg, nLeft, nRight);
std::cout << "hh:" << hh << " value:" << vecTestgg[hh] << endl;;
for (auto value : vecTestgg)
{
std::cout << value << " ";
}
system("pause");
}
结果:
返回的索引的数据,前面的是小于它的,后面的是大于它的
】
打印结果如下:
[
Partition函数以右边为基准情况:
4 1 2 5 6 7 8 6 5 100 200 300 45 66 42 17 89 65 33 15 24
-------------------------------------
4 1 2 5 6 7 8 6 5 100 200 300 45 66 42 17 89 65 33 15 24
4 1 2 5 6 7 8 6 5 100 200 300 45 66 42 17 89 65 33 15 24
4 1 2 5 6 7 8 6 5 100 200 300 45 66 42 17 89 65 33 15 24
4 1 2 5 6 7 8 6 5 100 200 300 45 66 42 17 89 65 33 15 24
4 1 2 5 6 7 8 6 5 100 200 300 45 66 42 17 89 65 33 15 24
4 1 2 5 6 7 8 6 5 100 200 300 45 66 42 17 89 65 33 15 24
4 1 2 5 6 7 8 6 5 100 200 300 45 66 42 17 89 65 33 15 24
4 1 2 5 6 7 8 6 5 100 200 300 45 66 42 17 89 65 33 15 24
4 1 2 5 6 7 8 6 5 100 200 300 45 66 42 17 89 65 33 15 24
4 1 2 5 6 7 8 6 5 100 200 300 45 66 42 17 89 65 33 15 24
4 1 2 5 6 7 8 6 5 100 200 300 45 66 42 17 89 65 33 15 24
4 1 2 5 6 7 8 6 5 100 200 300 45 66 42 17 89 65 33 15 24
4 1 2 5 6 7 8 6 5 100 200 300 45 66 42 17 89 65 33 15 24
4 1 2 5 6 7 8 6 5 100 200 300 45 66 42 17 89 65 33 15 24
4 1 2 5 6 7 8 6 5 100 200 300 45 66 42 17 89 65 33 15 24
4 1 2 5 6 7 8 6 5 17 200 300 45 66 42 100 89 65 33 15 24
4 1 2 5 6 7 8 6 5 17 200 300 45 66 42 100 89 65 33 15 24
4 1 2 5 6 7 8 6 5 17 200 300 45 66 42 100 89 65 33 15 24
4 1 2 5 6 7 8 6 5 17 200 300 45 66 42 100 89 65 33 15 24
4 1 2 5 6 7 8 6 5 17 15 300 45 66 42 100 89 65 33 200 24
4 1 2 5 6 7 8 6 5 17 15 24 45 66 42 100 89 65 33 200 300
hh:11 value:24
4 1 2 5 6 7 8 6 5 17 15 24 45 66 42 100 89 65 33 200 300
请按任意键继续. . .
---------------------
Partition函数以左边为基准情况:
4 1 2 5 6 7 8 6 5 100 200 300 45 66 42 17 89 65 33 15 24
-------------------------------------
2 1 2 5 6 7 8 6 5 100 200 300 45 66 42 17 89 65 33 15 24
2 1 2 5 6 7 8 6 5 100 200 300 45 66 42 17 89 65 33 15 24
2 1 4 5 6 7 8 6 5 100 200 300 45 66 42 17 89 65 33 15 24
hh:2 value:4
2 1 4 5 6 7 8 6 5 100 200 300 45 66 42 17 89 65 33 15 24
请按任意键继续. . .
]