C ++如何基于幅度对数组中的值进行排序?

时间:2018-11-09 03:37:49

标签: c++ sorting

例如,我有一个数组:

array[5]  = {-3, 4, 5, 1, -2}

我正在尝试将其排序为{1, -2, -3, 4, 5}

我尝试用abs值进行气泡排序,但这没用。

3 个答案:

答案 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));
});