奇偶数排序
来源:互联网 发布: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;}
测试代码和结果与上面一致,这里就不做赘述了。
梦想还是要有的,万一实现了呢~~~ヾ(◍°∇°◍)ノ゙
阅读全文
0 0
- 数组奇偶数排序
- 奇偶数排序
- 奇偶数排序
- 奇偶数排序
- 奇偶数排序
- 奇偶数间隔排序问题
- 奇偶数排序(调序)
- 产生随机数 奇偶数排序 素数求和
- 奇偶数排序,荷兰国旗问题
- 《编程之法》:奇偶数排序
- 奇偶数
- 奇偶数
- 奇偶数排序--整数数组的奇偶数分开(小米公司笔试题)
- 奇偶排序
- 奇偶排序
- 奇偶排序
- 奇偶排序
- 奇偶排序
- HHUOJ_1350: 破译邮件
- Oracle数据库-QSL(上)
- 蓝桥杯 算法训练 未名湖边的烦恼 (Java解题)
- 【笔试题】
- 日常工作总结
- 奇偶数排序
- 使用OwnCloud建立属于自己的私有的云存储网盘(百度网盘)
- OpenGL图形渲染管线图解
- [SCOI2007]降雨量
- HDOJ 2103 Family planning
- 4用于cifar10的卷积神经网络-4.13优化器FtrlOptimizer的汇总结果分析
- 用jad反编译jar包经验
- Debug: babel arrow function 'unexpected token' in React.Component
- vs2010,vs2015,快捷备注,快捷取消