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

时间:2018-05-15 18:36:59

标签: c arrays

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

#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;
        }
    }
}

1 个答案:

答案 0 :(得分: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是。

希望有帮助。