数组排序(正数在左,负数在右)
import java.util.Arrays; /** * [1,2,3,-2,-4,5,3,-2,4,1,-5,3]数组排序 输出结果[1,2,3,5,3,4,1,-2,-4,-2,-5] 要求: 1.正数在左,负数在右, 2.相对顺序不变, 3.空间复杂度O(1) */ public class ArraySort { //arr 待排序数组,data 需要插入的数据, dataIndex待插入数据的原始下标 public static int[] InsertArr(int arr[], int data, int dataIndex){ for(int index = dataIndex; index < arr.length-1; index++){ arr[index] = arr[index+1]; } arr[arr.length-1] = data; return arr; } public static void ArrSort(int arr[]){ boolean flag; for(int index = 0; index <arr.length; ){ //如果一次子循环,没有数据进行交换,则执行index ++,继续向后遍历,但是如果有数据交换就不能index ++了, // 因为交换的该位置同样有可能为负数,则需要继续执行是否交换判断逻辑 flag = false; if (arr[index] < 0){ //从左向右遍历,如果有负数,则看负数后面还有没有正数,如果有正数,则把该负数取出,其后面的数依次前移,该负数插入到数组的最后一位 for(int minusIndex = index; minusIndex< arr.length; minusIndex++){ if (arr[minusIndex] > 0){ //将该负数插入到数组的尾部,其余数据依次前移 arr = InsertArr(arr, arr[index], index); flag = true; System.out.println(Arrays.toString(arr)); break; } } } //如果为真就不执行index++了,继续判断arr[index]是否为负数 if(flag) continue; index++; } } public static void main(String[] args) { System.out.println("原始数组排列顺序:"); int arr[] = {1,2,3,-2,-4,5,3,-2,4,1,-5,3}; System.out.println(Arrays.toString(arr)); System.out.println("排列过程:"); ArrSort(arr); System.out.println("数组最后排列结果:"); System.out.println(Arrays.toString(arr)); } }
执行结果:
原始数组排列顺序:
[1, 2, 3, -2, -4, 5, 3, -2, 4, 1, -5, 3]
排列过程:
[1, 2, 3, -4, 5, 3, -2, 4, 1, -5, 3, -2]
[1, 2, 3, 5, 3, -2, 4, 1, -5, 3, -2, -4]
[1, 2, 3, 5, 3, 4, 1, -5, 3, -2, -4, -2]
[1, 2, 3, 5, 3, 4, 1, 3, -2, -4, -2, -5]
数组最后排列结果:
[1, 2, 3, 5, 3, 4, 1, 3, -2, -4, -2, -5]