109 lines
2.1 KiB
C++
109 lines
2.1 KiB
C++
#include"util.h"
|
|
#include <iostream>
|
|
using namespace std;
|
|
|
|
int Limit_Int(int value, int minValue, int maxValue)
|
|
{
|
|
if (value < minValue)
|
|
{
|
|
return minValue;
|
|
}
|
|
else if (value > maxValue)
|
|
{
|
|
return maxValue;
|
|
}
|
|
else
|
|
{
|
|
return value;
|
|
}
|
|
}
|
|
|
|
double Limit_Double(double value, double minValue, double maxValue)
|
|
{
|
|
if (value < minValue)
|
|
{
|
|
return minValue;
|
|
}
|
|
else if (value > maxValue)
|
|
{
|
|
return maxValue;
|
|
}
|
|
else
|
|
{
|
|
return value;
|
|
}
|
|
}
|
|
|
|
void QuickSort(Eigen::VectorXi& array, Eigen::VectorXi& index, int low, int high) {
|
|
if (low < high) {
|
|
//分段位置下标
|
|
int standard = GetStandard(array, index, low, high);
|
|
//递归调用排序
|
|
//左边排序
|
|
QuickSort(array, index, low, standard - 1);
|
|
//右边排序
|
|
QuickSort(array, index, standard + 1, high);
|
|
}
|
|
}
|
|
|
|
int GetStandard(Eigen::VectorXi& array, Eigen::VectorXi& index, int i, int j) {
|
|
//基准数据
|
|
int key = array(i);
|
|
int key2 = index(i);
|
|
while (i < j) {
|
|
//因为默认基准是从左边开始,所以从右边开始比较
|
|
//当队尾的元素大于等于基准数据 时,就一直向前挪动 j 指针
|
|
while (i < j && (array(j) > key || array(j) == key)) {
|
|
j--;
|
|
}
|
|
//当找到比 array[i] 小的时,就把后面的值 array[j] 赋给它
|
|
if (i < j) {
|
|
array(i) = array(j);
|
|
index(i) = index(j);
|
|
}
|
|
//当队首元素小于等于基准数据 时,就一直向后挪动 i 指针
|
|
while (i < j && (array(i) < key || (array(i) == key))) {
|
|
i++;
|
|
}
|
|
//当找到比 array[j] 大的时,就把前面的值 array[i] 赋给它
|
|
if (i < j) {
|
|
array(j) = array(i);
|
|
index(j) = index(i);
|
|
}
|
|
}
|
|
//跳出循环时 i 和 j 相等,此时的 i 或 j 就是 key 的正确索引位置
|
|
//把基准数据赋给正确位置
|
|
array(i) = key;
|
|
index(i) = key2;
|
|
return i;
|
|
}
|
|
|
|
void Unique(Eigen::VectorXi& array, Eigen::VectorXi& index)
|
|
{
|
|
int overNum = 0;
|
|
for (int i = 0; i < array.rows(); i++)
|
|
{
|
|
if (i + overNum == array.rows())
|
|
break;
|
|
|
|
index(i) = index(i + overNum);
|
|
array(i) = array(i + overNum);
|
|
|
|
if (i + overNum + 1 == array.rows())
|
|
break;
|
|
|
|
if (array(i + overNum) == array(i + overNum + 1))
|
|
{
|
|
overNum++;
|
|
}
|
|
}
|
|
|
|
if (overNum == 0)
|
|
return;
|
|
|
|
int nbr = array.rows() - overNum;
|
|
Eigen::VectorXi tempindex = index.head(nbr);
|
|
Eigen::VectorXi temparray = array.head(nbr);
|
|
index = tempindex;
|
|
array = temparray;
|
|
} |