如何以特定方式在C ++中对数组进行排序

时间:2013-11-21 20:53:18

标签: c++ arrays sorting

我想以某种方式对数组进行排序,以便它看起来像 - 一个[0]> = A [1] = A [2]> = [3]< = A [4] 我不知道从哪里开始。 任何建议将不胜感激!

5 个答案:

答案 0 :(得分:2)

对整个数组进行排序(选择您想要的任何排序算法)。然后从头开始接受每一对并交换对中的元素

2,4,1,5,6,3,7,9,8,10

排序为:1,2,3,4,5,6,7,8,9,10

配对和交换:(2,1),(4,3),(6,5),(8,7),(10,9)

结果:2,1,4,3,6,5,8,7,10,9

答案 1 :(得分:1)

我在这里假设关系是包容性的(在某种意义上它们继续到行尾 - a [0]> = max(a [1],a [2],...) ,和[1]< = min(a [2],a [3],..)等等)。否则,这不是唯一定义的,因为{5,4,3,2,1}可以被分类为例如{5,1,4,3,2}或{3,2,5,1,4}。

所以,假设是这种情况,可以通过按降序对整个数组进行排序,然后只交错它们来轻松解决 -

 a[0], a[n-1], a[1], a[n-2], ...

等等。只需循环使用两个索引,一个从头开始,一个从头开始,或者使用类似的东西 -

for (i=0; i<n/2; i++) {
    result[i*2] = sorted[i];
    result[i*2+1] = sorted[n-i];
}
if (n%2) 
    result[n-1] = sorted[n/2]

答案 2 :(得分:1)

这是代码,显然你可以改变数组长度和数字以符合你的规格。

#include <iostream>
#include <algorithm> 
 using namespace std;
void special_Sort(int *array, int size){
//doesn't return a value, changes the values inside the array
int temp; 
//for swapping purposes 
sort(array, array+size);

//sorts the array in ascending order
for(int i=0; i<size; i=i+2){
    temp=array[i];
    array[i]=array[i+1];
    array[i+1]=temp; 
}

//array is now sorted 
}

int main(){
// array declaration, call the function, etc...
int array[10]={2,4,1,5,6,3,7,9,8,10};
int *pointer; 
pointer=&array[0];

special_Sort(pointer, 10);

// if you want to print the result 
//   for(int i =0; i<10; i++)
//      cout<<array[i]<<" ";    

return 0;
}

答案 3 :(得分:0)

如果您只是按照希望值随意上升和下降的方式对其进行排序,则可以通过检查数组中的值并交换元素(如果它们不满足您的排序约束)来实现此目的。

目前我还没有编译器,你必须实现交换,但这样的事情可能会有效:

for(i=0; i < a.length(); i++){
  //If index is even
  if(i%2 == 0){
     if(a[i] < a[i+1]){
        swap(a[i], a[i+1]);
     }
  } else {      ///If index is odd
     if(a[i]>a[i+1]){
        swap(a[i], a[i+1];
     }
    }
  }

我不同意此处发布的其他答案,因此您必须根据偶数和奇数索引元素的关系找到所需内容。

答案 4 :(得分:0)

采取的步骤
1) 生成一些随机数组
2) 排序数组
3) 根据需要使用备用&lt; =,&gt; =比较

切换元素

以下是执行该操作的代码 :(忽略随机生成器,它只是生成数组的简单方法)

#define sizeArr 50
int main(void)
{
    int array[sizeArr];
    int i, temp;

    for(i=0;i<sizeArr;i++)
    {
        array[i]=randomGenerator(1, 1000);
        Sleep(2);//force clock tick for new srand() to be effective in rand() generator
    }

    //sort array
    qsort(array, sizeArr, sizeof(int), cmpfunc);

    //pick the first non repeat 90th percent and print
    for(i=0;i<sizeArr-1;i++)
    {
        if(i%2==0)//alternate between >= && <=
        {
            if(array[i+1] >= array[i])
            {
                temp = array[i+1];
                array[i+1]=array[i];
                array[i]=temp;
            }
        }
        else
        {
            if(array[i+1] <= array[i])
            {
                temp = array[i+1];
                array[i+1]=array[i];
                array[i]=temp;
            }
        }
    }
    getchar();  

    return 0;
}


int cmpfunc (const void * a, const void * b)
{
   return ( *(int*)a - *(int*)b );
}

int randomGenerator(int min, int max)
{
    int random=0, trying=0;

    trying = 1;         
    srand(clock());
    while(trying)
    {
        random = (rand()/32767.0)*(max+1);
        (random >= min) ? (trying = 0) : (trying = 1);
    }

    return random;
}