排序一维数组的功能不起作用?

问题描述 投票:0回答:1

我需要创建一个函数来对一维数组进行排序,使得小于第一个元素的数字在它之前移动,数字大于或等于之后移动。这是我的代码:

#include<stdio.h>

void sort(int a[], int n);

int main(){
    int a[10], i, m;
    do{
        printf("Enter number of elements: ");
        scanf("%d", &m);
    } while (m < 1 || m > 10);

    for (i = 0; i < m; i++)
        scanf("%d", &a[i]);

    for (i = 0; i < m; i++)
        sort(a, m);

    for (i = 0; i < m; i++)
        printf("%d ", a[i]);

    return 0;
}

void sort(int a[], int m){
    int i, j, p, temp;
    p = a[1];

    for (j = 2; j < m; j++){
        if (p >= a[j]){
            temp = a[j];
            a[j] = a[1];
            a[1] = temp;
        }
    }
}
c arrays
1个回答
3
投票

排序功能是个问题。通过纸上的逻辑工作,你会看到发生了什么。你的p被固定到位,这是问题的一部分。您会注意到您的输入正在移动,这只是它如何移动它们的问题

如果将其放置到位,此排序功能应该有效。

void sort(int a[], int m){
int i, j, p, temp;

for (i =0; i<m;i++){
    for(j=i;j<m;j++){
        if (a[j]<a[i]){
            temp = a[i];
            a[i] = a[j];
            a[j] = temp;
        }
    }
}

编辑,哦,我可能误解了你的问题。这是说你不希望它们处于完全完美的顺序,而是你想要比起始元素小的东西在它前面但是它们在输入时的顺序是相同的吗?

编辑2:对不起,我误解了你以前的问题。这就是我想出的。

#include<stdio.h>

void sort(int a[], int n);

int main(){
    int a[10], i, m;
    do{
        printf("Enter number of elements: ");
        scanf("%d", &m);
    } while (m < 1 || m > 10);

    for (i = 0; i < m; i++)
        scanf("%d", &a[i]);

    sort(a, m);

    for (i = 0; i < m; i++)
        printf("%d ", a[i]);

    return 0;
}

void sort(int a[], int m){
    int i, j, p, temp; 
    int pindex;

    p = a[0];
    pindex =0;

    for (i =0; i<m;i++){
        if(a[i]<p){
            temp = a[i];
            for(j=i;j>pindex;j--){
               a[j] = a[j-1];
            }
            a[pindex]=temp;
            pindex++;
        }
    }

}

我认为你的初始方法的最大问题是你每次循环运行时都将p设置为第一个元素。如果p随着每次迭代而改变,它最终会破坏一切。

我做的更改:我使用名为pindex的变量跟踪p的当前位置。每当我发现一个小于p的元素时,我会将每个元素向后滑动,直到我到达p(包括p)。然后我将我在索引中找到的元素放在p所在的位置。

希望有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.