在C中排序数字序列

时间:2016-02-07 05:53:01

标签: c

我如何能够检查第一和第二序列中的数字排名,看看是否以相同的方式排序?还有一种方法可以在没有用户输入的情况下计算元素的数量吗?

我想输入一个数字序列(长度必须是偶数),程序应该做什么将序列分成两半。并且对于分割序列中的所有元素,它们应该以对于所有i,j,1< = i,j< = n,a [i]< = a [j]的方式排列,当且仅当b [ i]< = b [j],其中n是序列的长度。

基本上它会检查序列前半部分的顺序,并检查下半部分的顺序是否相似。

ex: 
input: 7 5 9 13 12 4 2 25 33 26
seq1: 7 5 9 13 12
seq2: 4 2 25 33 26
Are order equivalent

这个序列等级顺序为7,5,9,13,12是第4,5,3,1,1,2和下半部分也具有相同的排序顺序。与输入2,1,5,4相同,它们也是顺序相同的,因为seq1顺序是第1大,第2大是与seq2相同。

我不明白我如何排序序列的顺序,我正在考虑使用冒泡排序,但后来我意识到这是错误的。我需要将序列分成两半然后检查半序列,看看是否有相同的序列。

这是我到目前为止所拥有的:

int main(){
    int array[100], n, c, d, swap, first[100], sec[100];
    printf("enter number of elements: ");
    scanf("%d\n", &n)
    printf("enter %d integers:\n", n);
    for(c = 0; c < n; c++)
        scanf("%d", &array[c]);
    //--------------------------------------------------
        printf("\n\n");
        printf("sorted elements in a ascending order\n");
        for(c=0; c<n; c++){ 
            printf("%d ", array[c]);
        }
        printf("\n\n");
    //place first half of array in first array
        for(c = 0; c< (n/2); c++){
            first[c] = array[c]; 
        }
    //place sec half array in sec array
        int a = 0;
        for(c = (n/2); c < (n); c++ ){
            sec[a] = array[c];
            a++;
        }
    //------------------------------------------print arrays 
        printf("\nfirst\n ");
        for(c = 0; c<(n/2); c++){
            printf("%d ", first[c]);
        }
        printf("\nsec\n ");
        for(c = 0; c<(n/2); c++){
            printf("%d ", sec[c]);
        }
        printf("\n\n");
        //bubble sort for first half
        for(c = 0; c <(n-1); c++){
            //c = 3;
            for(d=c; d < n; d++){
                if (d > c){
                    break;
                }
                if(first[d] > first[c]){
                    printf(" before d %d", first[c]);
                    swap = first[c];
                    first[d] = first[c];
                    first[c] = swap;
                    printf(" end d %d", first[d]);
                }
                printf(" before d %d", first[c]);
            }
    }
        for(c = 0; c < (n/2); c++ ){
    //----------------------------------------------------print array after sort
            printf("\n\n");
            printf("first array sort %d\n", first[c]);
        }
    return 0;
}

2 个答案:

答案 0 :(得分:0)

看起来您可能希望将输入作为一个字符串/ char数组然后解析它。不确定c#是否有任何可以帮助你解决这个问题,但是可以通过使用数字之间的空格将它们拆分,然后将单个数字char序列转换为int来实现。然后你可能想把这些intt放在某种数组或列表中,无论你喜欢什么,都可以进行排序。之后,算法可能需要一些工作,并且可能涉及一些数组,但应该没有太复杂的事情。

答案 1 :(得分:0)

以下内容应该有效。 C#中的代码:

Console.Write("input: ");
var input = Console.ReadLine();
var nums = input.Split(' ').Select(s => int.Parse(s)).ToList();
if (nums.Count % 2 != 0) {
    throw new InvalidOperationException("Length must be even.");
}
var seq1 = nums.GetRange(0, nums.Count / 2);
var seq2 = nums.GetRange(nums.Count / 2, nums.Count / 2);
Console.WriteLine("seq1: " + string.Join(" ", seq1));
Console.WriteLine("seq2: " + string.Join(" ", seq2));
bool areEquiv = true;
for (int i = 0; i < seq1.Count && areEquiv; i++) {
    for (int j = 0; j < seq2.Count && areEquiv; j++) {
        if ((seq1[i] <= seq1[j]) != (seq2[i] <= seq2[j])) {
            areEquiv = false;
        }
    }
}
Console.WriteLine(string.Format("Are {0}order equivalent", areEquiv ? string.Empty : "NOT "));

输入和输出示例:

input: 7 5 9 13 12 4 2 25 33 26
seq1: 7 5 9 13 12
seq2: 4 2 25 33 26
Are order equivalent

input: 5 6 9 8
seq1: 5 6
seq2: 9 8
Are NOT order equivalent