C 第一个和最后一个的赔率
我正在努力解决一个问题,比如。。。 在一个数组中,我们必须将所有的奇数元素移到开头…偶数元素移到结尾。。。 我试过这种方法,但这里甚至失去了秩序…有人能帮我吗??????? 我得到的输出是…1 3 5 7 9 4 8 2 6C 第一个和最后一个的赔率,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
需要线性时间就地解决方案
#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是重复的,因为它们都是偶数。在您的示例中,是一个“无重复”的数组最多只能包含两个元素,一个奇数和一个偶数。@verdesmaraldqsort
不稳定是我想到的第一个问题,但出于好奇,我尝试用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;
}