例如,我有一个数组:
array[5] = {-3, 4, 5, 1, -2}
我正在尝试将其排序为{1, -2, -3, 4, 5}
。
我尝试用abs值进行气泡排序,但这没用。
答案 0 :(得分:3)
有很多类似的方法可以进行排序,实际上,最简单的方法之一就是使用<algorithm>
中的std::sort()
函数...(请记住要设置您的 C ++ 11或更高版本的编译器)
创建一个advanced_absolute函数(如注释中所指出):
constexpr auto min_abs(int x)
{
return x < 0 ? signed(unsigned(-1)) - signed(unsigned(x) + 1U) : x;
}
并排序:
std::sort(std::begin(array), std::end(array), [](int const num1, int const num2) -> bool
{
return (num1 == INT_MIN ? min_abs(num1) : std::abs(num1)) < (num2 == INT_MIN ? min_abs(num2) : std::abs(num2));
});
并将它们放在顶部...
#include <algorithm>
#include <iterator> // This is already included the <iostream> and other headers dependent on this header...
答案 1 :(得分:0)
您可以使用以下代码:
#include <stdio.h>
#include <stdlib.h>
#define size 5
void swap(int *xp, int *yp)
{
int temp = *xp;
*xp = *yp;
*yp = temp;
}
void bubbleSort(int arr[], int n)
{
int i, j;
for (i = 0; i < n-1; i++)
for (j = 0; j < n-i-1; j++)
if (abs(arr[j]) > abs(arr[j+1]))
swap(&arr[j], &arr[j+1]);
}
int main()
{
int array[size] = {-3, 4, 5, 1, -2};
bubbleSort(array, size);
for (int i=0; i<size; i++)
{
printf("%d ", array[i]);
}
return 0;
}
它可以使您更好地了解事物在细粒度水平下的工作方式。
C中的Bubblesort函数取自here
答案 2 :(得分:0)
遵循ruk的想法,但简化了:
#include <algorithm>
#include <iterator>
#include <cstdlib>
// ...
std::sort(std::begin(array), std::end(array), [](int const num1, int const num2)
{
// Don't call std::abs(INT_MIN), just return the correct value directly.
if (num1==INT_MIN) return false; // First, because INT_MIN<INT_MIN==false
if (num2==INT_MIN) return true;
// If we get here, neither value is INT_MIN so we can safely call std::abs
return (std::abs(num1) < std::abs(num2));
});