首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个函数,它接受数组A和索引I并重新排列它

一个函数,它接受数组A和索引I并重新排列它
EN

Stack Overflow用户
提问于 2015-03-15 00:26:20
回答 3查看 212关注 0票数 0

问题是:将长度为n的数组A和索引I写入A中,并重新排列小于Ai的元素,使所有小于Ai的元素首先出现,然后是等于Ai的元素,然后是大于Ai的元素。

对我的代码的解释:

向用户询问n个数字,即11,然后问他要用什么索引来重新排列元素。它将它带到function1中,并创建一个for循环并执行一个if else语句。如果Ai < A{index},将其放在起始位置,否则,如果它较少,则将其放在末尾,或将其放在中间:

这是我的密码

代码语言:javascript
复制
#include <iostream>
using namespace std;

void function1(int a[], int ind);
int main()

{
    int a[11];
    int index;
    cout << " enter the numbers: " << endl;
    for(int i=0; i < 11; i++)
        cin >> a[i];

    cout << "what is the index ? " << endl;
    cin >> index;

    function1(a,index);
}

void function1(int a[], int ind)
{
    int x = a[ind];
    int newArray[11];
    for(int i=0; i < 11; i++)
    {
        if(a[i] < x)
        {
            newArray[i] = a[i];
        }
        else if(a[i] > x)
        {
            newArray[10-i] = a[i];
        }
        else
        {
            newArray[10/2] = a[i];
        }
    }

    for(int i=0; i<11; i++)
        cout << newArray[i] << " ";
}

我期望得到的输出是新数组的重新排列,它看起来可能类似于以下内容:

A0.x.n-1,其中x是代表ai的索引,但是我得到了不正确的输出,数字随机分布在各处。

我的逻辑怎么了?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-15 00:46:05

问题是(就像Olaf指出的那样),在需要两个索引的情况下,只取一个索引。此外,您无法知道是否要在新数组的中间插入既不小于a[ind]也不大于a[ind](意味着等于a[ind])的元素。(假设3 2 1和索引3的结果是2 1 3,但3不是中间的!)

更新版本(允许多个元素具有与枢轴元素相同的值)

代码语言:javascript
复制
void rearange(int* data, int size, int pivot)
{
    int* temp_data = new int[size];
    int start_index = 0, end_index = size - 1;

    for (int i = 0; i < size; i++)
    {
        if (data[i] < data[pivot]) // -> insert 'before' pivot element
        {
            temp_data[start_index] = data[i];
            start_index++;
        }
        else if (data[i] > data[pivot]) // -> insert 'behind' pivot element
        {
            temp_data[end_index] = data[i];
            endIndex--;
        }
        // else: skip pivot(s)
    }

    // insert pivot element(s)
    for (int i = start_index; i <= end_index; i++)
    {
        temp_data[i] = data[pivot];
    }

    for (int i = 0; i < size; i++)
    {
        std::cout << temp_data[i] << " ";
    }
    delete[] temp_data;
}

输入:

代码语言:javascript
复制
11 10 9 8 7 7 7 6 5 4 3
5

输出

代码语言:javascript
复制
6 5 4 3 7 7 7 8 9 10 11

正如您所看到的,所有小于元素5(值为7)的元素都在前面,所有较大的元素都在pivot元素后面。所有与枢轴值相同的其他元素都围绕着位置5,只要有空闲空间。然而,重新排列的元素还没有排序(除了相对于枢轴元素的位置)!

票数 1
EN

Stack Overflow用户

发布于 2015-03-15 00:44:56

对于越来越小的值使用相同的索引i。这意味着,如果仅最后一个值a[10]大于x,那么您将在第一个位置newArray[10 - 10]中写入它,即使您已经填充了所有位置,直到第10个位置。另一个问题是,当您有多个middle值时。它们都将存储在newArray[5]中。

您想要实现的是分区,正如在快速排序算法中使用的那样。

您需要维护两个索引(指针),一个用于较小的(左),一个用于较大的(右)值。

票数 1
EN

Stack Overflow用户

发布于 2015-03-15 00:31:24

您必须在开始时确定数组的大小,并将数组的固定大小作为参数传递给函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29055879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档