Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 第一个和最后一个的赔率_C_Arrays_Algorithm - Fatal编程技术网

C 第一个和最后一个的赔率

C 第一个和最后一个的赔率,c,arrays,algorithm,C,Arrays,Algorithm,我正在努力解决一个问题,比如。。。 在一个数组中,我们必须将所有的奇数元素移到开头…偶数元素移到结尾。。。 我试过这种方法,但这里甚至失去了秩序…有人能帮我吗??????? 我得到的输出是…1 3 5 7 9 4 8 2 6 需要线性时间就地解决方案 #include<stdio.h> void swap(int *p,int *q) { *p=*p^*q; *q=*p^*q; *p=*p^*q; } int main() { int arr[]={ 2

我正在努力解决一个问题,比如。。。 在一个数组中,我们必须将所有的奇数元素移到开头…偶数元素移到结尾。。。 我试过这种方法,但这里甚至失去了秩序…有人能帮我吗??????? 我得到的输出是…1 3 5 7 9 4 8 2 6
需要线性时间就地解决方案

 #include<stdio.h>
 void swap(int *p,int *q)
 {
 *p=*p^*q;
  *q=*p^*q;
  *p=*p^*q;
 }
  int main()
  {
  int arr[]={ 2, 1 ,4 ,3 ,6 ,5 ,8 ,7 ,9};
  int  odd=0;
  int even=0;
  int arr_size = sizeof(arr)/sizeof(arr[0]);
  while(even< arr_size){
     if(arr[even]&1)
        swap(&arr[odd++],&arr[even++]);
     else
        even++;
  }
 int i=0;
 for(i=0;i<arr_size ;i++)
 printf("%d  ",arr[i]);
 return 0;
}
#包括
无效交换(int*p,int*q)
{
*p=*p^*q;
*q=*p^*q;
*p=*p^*q;
}
int main()
{
int arr[]={2,1,4,3,6,5,8,7,9};
int奇数=0;
int偶数=0;
int arr_size=sizeof(arr)/sizeof(arr[0]);
while(偶数对于(i=0;i,如果交换不是平行的,那么您可以简单地创建两个for循环,一个用于增加偶数,另一个用于增加赔率。
大概是这样的:-

  j=0;
  for(i=2;i<a_size;i+2)
  {
     b[j++]=a[i];
  }
  for(i=1;i<a_size;i+2)
  {
     b[j++]=a[i];
  }
j=0;

对于(i=2;i您可以通过一个特殊的比较函数调用
qsort

#include <stdio.h>
#include <stdlib.h>

int cmp(const void * a, const void * b) {
    int aa = *((int*)a);
    int bb = *((int*)b);
    // If aa is odd and bb is even aa is smaller
    if(aa%2 == 1 && bb%2 == 0)
        return -1;
    // If bb is odd and aa is even bb is smaller
    if(aa%2 == 0 && bb%2 == 1)
        return 1;
    // If both even or odd respect current position. (If a is before b in arr a has lower address)
    if(a<b)
        return -1;
    return 1;
}
int main(void) {
    int arr[] = { 2, 1 ,4 ,3 ,6 ,5 ,8 ,7 ,9};    
    int len = sizeof(arr)/sizeof(arr[0]);
    int i;
    qsort(arr, len, sizeof(int), cmp);
    for(i=0; i<len; i++)
        printf("%d ", arr[i]);
    return 0;
}
#包括
#包括
int cmp(常数无效*a,常数无效*b){
int aa=*((int*)a);
int bb=*((int*)b);
//如果aa为奇数,bb为偶数,则aa较小
如果(aa%2==1&&bb%2==0)
返回-1;
//如果bb是奇数且aa是偶数,则bb较小
如果(aa%2==0&&bb%2==1)
返回1;
//如果偶数或奇数都与当前位置有关。(如果a在arr中的b之前,a的地址较低)

如果(a这个解决方案怎么样

#include<stdio.h>


  int main()
  {
  int i;
  int arr[]={ 2, 1 ,4 ,3 ,6 ,5 ,8 ,7 ,9};
  int arr_size = sizeof(arr)/sizeof(arr[0]);
  int sorted[arr_size];
  int sp = 0;
  for(i=0;i<arr_size;i++){
     if(arr[i]&1){
        sorted[sp++]=arr[i];
     }
  }

  for(i=0;i<arr_size;i++){
     if(!(arr[i]&1)){
        sorted[sp++]=arr[i];
     }
  }

  for(i=0;i< arr_size ;i++)
    printf("%d  ", sorted[i]);
 return 0;
}
**更新**

虽然上面的操作会占用更多空间并在列表上运行两次,但下面的操作只在列表上运行一次,但仍会占用更多空间

 int main(){

  int i;
  int arr[]={ 2, 1 ,4 ,3 ,6 ,5 ,8 ,7 ,9};
  int arr_size = sizeof(arr)/sizeof(arr[0]);
  int sorted[arr_size];
  int even = 1+arr_size/2;
  int odd  = 0;

  for(i=0;i<arr_size;i++){
     if(arr[i]&1)
        sorted[odd++]=arr[i];
     else
        sorted[even++]=arr[i];
  }

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

 return 0;
}
intmain(){
int i;
int arr[]={2,1,4,3,6,5,8,7,9};
int arr_size=sizeof(arr)/sizeof(arr[0]);
整数排序[arr_size];
整数偶数=1+arr_大小/2;
int奇数=0;

对于(i=0;它的预期输出是1,3,5,7,9,2,4,6,8,9你想在结尾处是奇数还是偶数?你想把奇数和埃文斯排序吗?想在结尾处是偶数…不需要排序…所以你说你得到的输出是1 35 7 9 4 8 2 6。这有什么问题/hmm,OP似乎把
9
看作偶数。不幸的是,这不是ork.
qsort
不是一种稳定的排序,在末尾添加指针比较不足以使其稳定。有关详细说明,请参阅。@SreeRam我无法解释它是如何工作的,因为它不工作!;)我链接的问题很好地解释了为什么它不存在,你不理解哪一部分?@verdesmarald ok u提供了比较器功能…但是快速排序不能基于分区工作…(假设没有重复,这不会带来图片的稳定性…)我不确定你在说什么。请记住“重复”在稳定排序的上下文中,表示“比较相等的元素”,因此在您的示例中,2和4是重复的,因为它们都是偶数。在您的示例中,是一个“无重复”的数组最多只能包含两个元素,一个奇数和一个偶数。@verdesmarald
qsort
不稳定是我想到的第一个问题,但出于好奇,我尝试用qsort实现一个解决方案,指针比较:)。我用一些测试用例和编译器尝试了我的代码,它可以与所有测试用例和编译器一起工作,所以我认为不会有问题。你能给我一个测试用例(以及你使用的编译器)吗我的代码在哪里打破了问题需求的顺序?@SreeRam如果你想要一个到位的单通道解决方案,你应该在你的问题中这样说。@verdesmarald sry……应该更清楚地说明我的要求……请注意……除了使用链表/队列,我不知道其他方法
 1  3  5  7  9  2  4  6  8  
 int main(){

  int i;
  int arr[]={ 2, 1 ,4 ,3 ,6 ,5 ,8 ,7 ,9};
  int arr_size = sizeof(arr)/sizeof(arr[0]);
  int sorted[arr_size];
  int even = 1+arr_size/2;
  int odd  = 0;

  for(i=0;i<arr_size;i++){
     if(arr[i]&1)
        sorted[odd++]=arr[i];
     else
        sorted[even++]=arr[i];
  }

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

 return 0;
}