每天一道算法题——数组重排序

来源:互联网 发布:linux hexo github 编辑:程序博客网 时间:2024/06/06 01:25
写一个函数,输入是一个数组A, 以及下标i,要求函数将数组的元素进行调整,使得所有比A[i]小的元素排在前面,接着是所有等于A[i]的元素,最后排列的是所有大于A[i]的元素。例如给定A = 2 4 3 7 5 5 8 3. i = 5. 于是得到调整后的数组为:2 4 3 3 5 5 7 8
要求算法的空间复杂度是O(1),时间复杂度是O(n).

首先将基准值存入变量pivot当中,接下来创建两个指针begin,end,分别指向数组的头和尾。
如果arr[begin] >= pivot,就将arr[begin]与arr[end]交换,end--;否则begin++。这样在一次遍历之后就可以将数组分成小于基准值的一部分和大于等于基准值的一部分。这是从 大于等于基准值的那部分再遍历一次数组,如果arr[begin] > pivot,就将arr[begin]与arr[end]交换,end--;否则begin++。这样就可以实现算法了。
例如:2 4 3 7 5 5 8 3, pivot = 5;
begin-> 2 4 3 7 5 5 83<-end
arr[begin] < pivot, begin++ : 24 3 7 5 5 8 3
arr[begin] < pivot, begin++ : 2 4 3 7 5 5 8 3
arr[begin] < pivot, begin++ : 2 4 3 7 5 5 8 3
arr[begin] >= pivot, end-- : 2 4 33 5 5 8 7
arr[begin] >= pivot, end-- : 2 4 3 35 5 87
arr[begin] >= pivot, end-- : 2 4 3 38 5 5 7
arr[begin] >= pivot, end-- : 2 4 3 3 5 8 5 7
第二步与第一步一样,只是判断条件由arr[begin] >= pivot变成arr[begin] > pivot。

下面是代码实现:
package p_10_arrayresort;import java.util.Scanner;public class ResortArray {private int record = 0;public int[] reSort(int[] arr, int index){if(arr.length <= 1){return arr;}int pivot = arr[index];arr = reSortArr(arr, 0, arr.length-1, pivot, false);for(int i=0;i<arr.length;i++){if(arr[i]>=pivot){record = i;break;}}arr = reSortArr(arr, record, arr.length-1, pivot, true);return arr;}public int[] reSortArr(int[] arr, int start, int end,int pivot, boolean checked){if(start > end || pivot>arr.length){throw new IllegalArgumentException("this is a error number!");}if(start == end){return arr;}while(start < end){if((arr[start] >= pivot && !checked)  || (arr[start] > pivot && checked)){swap(arr, start, end);end--;}else{start++;}}return arr;}public void printArr(int[] arr){for(int e:arr){System.out.print(e+" ");}System.out.println();}public static void swap(int[] arr, int start, int end){arr[start] = arr[end] - arr[start]+(arr[end] = arr[start]);}public static void main(String[] args) {// TODO Auto-generated method stubScanner in = new Scanner(System.in);int n = in.nextInt();int index = in.nextInt();int[] arr = new int[n];for(int i=0; i<n; i++) {arr[i] = in.nextInt();}ResortArray ra = new ResortArray();ra.printArr(ra.reSort(arr, index));}}

将改动过程也贴上去,mark一下


package p_10_arrayresort;import java.util.Scanner;public class ResortArray {private int record = 0;public int[] reSort(int[] arr, int index){if(arr.length <= 1){return arr;}int pivot = arr[index];arr = reSortArr(arr, 0, arr.length-1, pivot, false);for(int i=0;i<arr.length;i++){if(arr[i]>=pivot){record = i;break;}}arr = reSortArr(arr, record, arr.length-1, pivot, true);return arr;}public int[] reSortArr(int[] arr, int start, int end,int pivot, boolean checked){//int pivot = arr[index];if(start > end || pivot>arr.length){throw new IllegalArgumentException("this is a error number!");}if(start == end){return arr;}/* * if(arr.length <= 1){ * return arr; * } * */while(start < end){if((arr[start] >= pivot && !checked)  || (arr[start] > pivot && checked)){swap(arr, start, end);end--;}else{start++;}}//while( (start<end && !checked) || (start<end && checked) ){//if(checked == false){//if(arr[start] >= pivot){//swap(arr, start, end);//end--;//}else{//start++;//}//}else{//if(arr[start] > pivot){//swap(arr, start, end);//end--;//}else{//start++;//}//}//}//for(int i=0;i<arr.length;i++){//if(arr[i]>=pivot){//record = i;//break;//}//}//record = start;return arr;}public void printArr(int[] arr){for(int e:arr){System.out.print(e+" ");}System.out.println();}public static void swap(int[] arr, int start, int end){arr[start] = arr[end] - arr[start]+(arr[end] = arr[start]);}public static void main(String[] args) {// TODO Auto-generated method stubScanner in = new Scanner(System.in);int n = in.nextInt();int index = in.nextInt();int[] arr = new int[n];for(int i=0; i<n; i++) {arr[i] = in.nextInt();}ResortArray ra = new ResortArray();ra.printArr(ra.reSort(arr, index));//ra.printArr(ra.reSortArr(arr, 0, arr.length-1, 5, false));//ra.printArr(ra.reSortArr(arr, ra.record, arr.length-1, 5, true));}}


阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 美海军陆战队进驻台湾大陆怎么办? 束脚裤带子怎么办系 眼角弄伤了应该怎么办 浴盆下水盖坏了怎么办 冒险岛勋章多了怎么办 玉手镯取不下来怎么办?终极绝招! 陆金所收益低怎么办 陆金所登录密码忘记怎么办 陆金所理财逾期怎么办 死亡家属晚上来闹怎么办 开车撞到人家属闹要请护工怎么办 骑马与砍杀战团打下城市怎么办 我的脑子有问题怎么办 公司外派异地工作医保怎么办 老鼠死在墙里面怎么办 父亲再婚婚后对我不好怎么办 皮衣搽了护理油后不亮了怎么办 新买的衣服皱了怎么办 新买的裙子很皱怎么办 新买的风衣很皱怎么办 新买的裙子皱了怎么办 货拉拉准点率低怎么办 定机票名字打错了怎么办 做坏事被发现了怎么办 在阳台做被发现怎么办 有秘密被发现了怎么办 微店没有收到货怎么办 cf与主机连接不稳定怎么办 穿越火线与主机连接不稳定怎么办 word被锁定无法编辑怎么办 平衡车系统乱了怎么办 监控老是滴滴的响怎么办 磁盘已满 文件未保存怎么办 cocos只有代码没有项目怎么办 电脑系统管理员密码忘记了怎么办 魔兽小队不显示职业颜色怎么办 魔兽多余的橙装怎么办? f117-f6不读硬盘怎么办 中飞院飞行学生停飞了怎么办 军人对你敬礼时怎么办 小孩抱着就睡放下就醒怎么办