我遇到这样的问题: 我得到了数组的大小和数组本身(所有的元素),我需要按照数组中的第一项(让我们称之为关键项)的方式对数组进行排序,使所有项目小于关键项目从关键项目左侧并且所有大于关键项的项目都是右键形式的关键项,但是项目需要与声明中的顺序相同,如下所示: 数组输入:
4 7 3 5 6 2 9 1 10 8
数组输出:
3 2 1 4 7 5 6 9 10 8
所以我想我可以只去一次数组,如果值小,那么关键项交换它们,如果值大于关键项,则将该值(项)放在最后(如果数组中有n项)将它放在n + 1处)然后将所有项目从当前索引向左移动一个位置,如:
| 4 | 7 | 3 | 5 | 6 | 2 | 9 | 1 | 10 | 8 |
| 4 | | 3 | 5 | 6 | 2 | 9 | 1 | 10 | 8 | 7 |
| 4 | 3 | 5 | 6 | 2 | 9 | 1 | 10 | 8 | 7 |
但是就像我需要在每次移动之后使迭代器保持不变(因此它可以再次检查那个地方)。 我有这样的代码:
int u=1;
for (int i=1;i<n;i++){
if (x[i]<x[u]){
swap(x[i],x[u]);
u+=1;
}else {
x[i]=x[n];
for (int k=i;k<n-1;k++){x[k]=x[k+1];}
i--;
}
}
我认为我在交换部分犯了一个错误,但我无法弄明白。
答案 0 :(得分:0)
您正在寻找的是使用STL的std::stable_partition()
算法:
将元素分为两组,同时保留其相对顺序
让它为你努力,例如:
#include <iostream>
#include <algorithm>
struct doPartitionOn
{
int m_key;
doPartitionOn(int key) : m_key(key) {}
bool operator()(int a)
{
return (a < m_key);
}
};
int main()
{
int arr[] = {4, 7, 3, 5, 6, 2, 9, 1, 10, 8};
for(int i = 0; i < 10; ++i)
std::cout << arr[i] << ' ';
std::cout << std::endl;
std::stable_partition(arr, arr+10, doPartitionOn(arr[0]));
for(int i = 0; i < 10; ++i)
std::cout << arr[i] << ' ';
std::cout << std::endl;
std::cin.get();
return 0;
}
4 7 3 5 6 2 9 1 10 8
3 2 1 4 7 5 6 9 10 8
或者,如果使用C ++ 11或更高版本,则可以使用lambda而不是手动仿函数:
#include <iostream>
#include <algorithm>
int main()
{
int arr[] = {4, 7, 3, 5, 6, 2, 9, 1, 10, 8};
for(int value: arr)
std::cout << value << ' ';
std::cout << std::endl;
std::stable_partition(arr, arr+10, [&arr](int a){ return (a < arr[0]); });
for(int value: arr)
std::cout << value << ' ';
std::cout << std::endl;
std::cin.get();
return 0;
}
4 7 3 5 6 2 9 1 10 8
3 2 1 4 7 5 6 9 10 8