每天一道算法题——数组重排序
来源:互联网 发布: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, 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
- 每天一道算法题——数组重排序
- 每天一道算法题——每天一道算法题
- 每天一道算法题——汉诺塔
- 每天一道算法题——
- 每天一道算法题(14)——N个降序数组,找到最大的K个数
- 每天一道算法题(32)——输出数组中第k小的数
- 每天一道算法题——二位数组中的查找
- 每天一道算法题——旋转数组的最小数字
- 每天一道算法题——调整数组顺序使奇数位于偶数前面
- 每天一道算法题(16)——合并已排序的链表
- 每天一道算法题(27)——找出元音字母并排序
- 每天一道算法题——合并两个排序的链表
- 【每天一道算法题】
- 【每天一道算法题】
- 【每天一道算法题】
- 每天一道算法题(16)——翻转链表
- 每天一道算法题(22)——扑克牌的顺子
- 每天一道算法题(23)——约瑟夫环问题
- 解决fatal: No remote repository specified. Please, specify either a URL...
- 4.4其他对象API(System类,Runtime类,Math类,Date类,Calendar类)
- FreeRTOS任务切换
- 总结:Nginx访问ftp的路径报404 错误!
- 因为这家美国公司,蚂蚁金服收购速汇金或胎死腹中
- 每天一道算法题——数组重排序
- 分枝定界法的一般步骤
- linux网络配置
- 奢侈手机品牌 Vertu 被卖给了土耳其人,这次只值 6100 万美元
- 与亚马逊Prime Air无人机实物近距离 | SXSW 2017
- 因为OLED显示屏,iPhone 8可能会是史上最贵iPhone
- 斯坦福华人教授研发柔性电极,像皮肤一样柔软、透明可拉伸
- 马云为什么要去“太空”?只因中国互联网的天真的变了
- 读书笔记1 MYSQL必知必会