奇偶数排序

来源:互联网 发布:qq群的淘宝客都是团队 编辑:程序博客网 时间:2024/05/21 20:23

问题描述

给定一个整数数组,请调整数组中数的顺序,使得所有奇数位于数组的前半分,>所有的偶数位于数组的后半部分,要求时间复杂度为O(n)。

方法1-1次快排-两头往中间搜索

结合快速排序的思想:一次快排能将小于中轴元素的值全放左边,大于中轴元素的值全放右边,那么推而言之,一次快排,也可以让所有奇数位于前半部分,所有偶数位于后半部分。

下面的代码用的方法是一次快排中的“两头往中间搜索”的方法。

/******************Author:tmwdate:2017-11-23******************/#include <stdio.h>#include <stdlib.h>int* odd_even_sort_like_qsort(int *array , int array_len){    //输入合法性检查    if(!array||array_len==0)        return NULL;    int low = 0;    int high = array_len-1;    int target = array[low];//取第一个数作为中枢元素,备份    while( low < high )    {        while( array[high]%2 == 0 && low < high )//后半部分为偶数            high--;        array[low] = array[high];        while( array[low]%2 != 0 && low < high )            low++;        array[high] = array[low];    }    array[low] = target;//类快排,不需要递归,一次性就做完了所有奇数位于数组的前半部分,所有的偶数位于数组的后半部分    return array;}

测试代码及结果如下:

int main(){    printf("测试代码!\n");    int i;    int a1[10] = {6,2,3,4,7,8,1,0,-1,-5};    printf("原数组为:");    for(i=0;i<10;i++)        printf("%d ",a1[i]);    printf("\n");    printf("奇偶排序后为:");    odd_even_sort_like_qsort(a1,10);    for(i=0;i<10;i++)        printf("%d ",a1[i]);    printf("\n");    int a2[16] = {23,3,28,5,6,100,54,-2,-17,2,-36,0,26,-11,9,16};    printf("原数组为:");    for(i=0;i<16;i++)        printf("%d ",a2[i]);    printf("\n");    printf("奇偶排序后为:");    odd_even_sort_like_qsort(a2,16);    for(i=0;i<16;i++)        printf("%d ",a2[i]);    printf("\n");    return 0;}

这里写图片描述


方法2-1次快排-前后指针往后搜索

前后指针往后搜索

算法准备:

  • 定义两个游标–front和back,一前一后,front指向数组的第一个元素,back指向第一个元素的前一个元素;
  • 定义一个游标–rear 指向数组的最后一个元素。

算法基本思想:

rear作为中枢元素,若front指向的元素为奇数,则游标前移,back游标不动;若front指向的元素为偶数,则back游标前移,back指向的元素与front指向的元素交换。直到front游标挪动到rear的前一位判定完是偶数(或者交换完是偶数)之后,back游标前移一位,back指向的元素与rear的中枢元素交换。

下面的代码用的方法是一次快排中的“前后指针往后搜索”的方法

关于第2种快排实现–前后指针往后快排的方法,见july《编程之法》P46-47

/********************Author:tmwdate:2017-11-24********************/#include <stdio.h>#include <stdlib.h>#define swap(x,y,z) (z=x,x=y,y=z)int* odd_even_sort_like_qsort_2(int *array , int array_len){    int front,back,rear,temp;    front = 0;    back = -1;//数组元素从0开始存起    rear = array_len - 1;    while( front < rear )    {        while( array[front]%2 == 0 && front < rear )            front++;        //当array[front]值为奇数时:交换        if( array[front]%2!=0 )        {            back++;            swap(array[back],array[front],temp);            front++;        }    }    //此时,front==rear    back++;    swap(array[back],array[front],temp);    return array;}

测试代码和结果与上面一致,这里就不做赘述了。


梦想还是要有的,万一实现了呢~~~ヾ(◍°∇°◍)ノ゙

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 无杆气缸行程大怎么办 c4d中模型变成线怎么办 内径槽异性需要车一刀怎么办 轴承太紧影响转速怎么办 电动车前轮蝶刹抱死怎么办 摩托三轮车油刹抱死怎么办 手动档汽车离合抱死怎么办 别克gl8后轮吃胎怎么办 扭力梁后轮吃胎怎么办 非独立悬挂吃胎怎么办 货车半轴法兰盘裂纹怎么办 小天才平板裂屏了怎么办 新车撞了个坑怎么办 新车碰了个坑怎么办 汽车顶被砸了个坑怎么办 途观l前减震异响怎么办 锦明8代声音太大怎么办 手机网页无法加载插件怎么办 微信公众号被投诉怎么办 住了酒店的尾房怎么办 喜欢前任的闺蜜怎么办 闺蜜给介绍对象怎么办 喜欢对象的发小怎么办 山东省直医保卡丢失怎么办 高铁票如果错过了怎么办 动车错过了时间怎么办 长途动车错过了怎么办 动车如果错过了怎么办 没有取票错过了怎么办 动车出站没检票怎么办 火车晚点耽误了下班车怎么办 动车票中途丢了怎么办 购买二手房异地铁路公积金怎么办 沈阳公积金卡丢了怎么办 住宅专项维修资金用完了怎么办 广州出租车丢了东西怎么办 广州的士丢了东西怎么办 网上找兼职被骗了怎么办 海信空调开不了机怎么办 海信空调遥控器开不了怎么办 学生遭套路贷反被仲裁怎么办