我如何能够检查第一和第二序列中的数字排名,看看是否以相同的方式排序?还有一种方法可以在没有用户输入的情况下计算元素的数量吗?
我想输入一个数字序列(长度必须是偶数),程序应该做什么将序列分成两半。并且对于分割序列中的所有元素,它们应该以对于所有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;
}
答案 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