Java 对零、负数和正数数组进行排序
我有一个Java数组Java 对零、负数和正数数组进行排序,java,arrays,sorting,Java,Arrays,Sorting,我有一个Java数组 int num[] = {5, -3, 0, -18, 1, 2, 0}; 我想让它看起来像这样 {-3, -18, 0, 0, 5, 1, 2} 我现在拥有的是这个 for (int i=0; i<num.length;i++) { for (int j=1; j<num.length-1;j++) { if (num[j]<0) {
int num[] = {5, -3, 0, -18, 1, 2, 0};
我想让它看起来像这样
{-3, -18, 0, 0, 5, 1, 2}
我现在拥有的是这个
for (int i=0; i<num.length;i++)
{
for (int j=1; j<num.length-1;j++)
{
if (num[j]<0)
{
temp=num[j];
c=num[j-1];
num[j-1]=temp;
num[j]=c;
}
}
}
但这种排序只是负数,我找不到如何对零进行排序的解决方案。
你能帮帮我吗?主要思想是让两个指针从int[]的开头和结尾向内迭代,直到它们相遇,如果正负指针放错了位置,就在途中交换它们。这将有助于:
public class Solution {
public void sortNumbers(int[] A) {
int a = 0;
int b = A.length - 1;
for (int i = 0; i < A.length && i <= b; i++) {
int cur = A[i];
if (cur < 0) {
this.swap(A, i, a);
a++;
} else if (cur > 0) {
this.swap(A, i, b);
b--;
i--;
}
}
}
private void swap(int[] A, int i, int j) {
int tmp = A[i];
A[i] = A[j];
A[j] = tmp;
}
}
运行时是打开的,其中n是int[]的长度。主要思想是让两个指针从int[]的开头和结尾向内迭代,直到它们相遇,如果正负指针放错了位置,则在途中交换它们。这将有助于:
public class Solution {
public void sortNumbers(int[] A) {
int a = 0;
int b = A.length - 1;
for (int i = 0; i < A.length && i <= b; i++) {
int cur = A[i];
if (cur < 0) {
this.swap(A, i, a);
a++;
} else if (cur > 0) {
this.swap(A, i, b);
b--;
i--;
}
}
}
private void swap(int[] A, int i, int j) {
int tmp = A[i];
A[i] = A[j];
A[j] = tmp;
}
}
运行时处于打开状态,其中n是int[]的长度。您可以使用简单的冒泡排序,比较相邻元素的符号,并交换那些站错i的元素。Ei-th的符号大于i+1-th:
冒泡排序是稳定的,所以这里的等号元素,等号元素被认为是那些具有相同符号的元素,不会改变它们的顺序,给你想要的结果。由于不是很有效,这个简单的算法仍然有助于理解排序方法是如何实现的,它不需要额外的空间,只对初始数组进行操作。您可以使用一个简单的冒泡排序,比较相邻元素的符号,并交换站错的元素。Ei-th的符号大于i+1-th:
冒泡排序是稳定的,所以这里的等号元素,等号元素被认为是那些具有相同符号的元素,不会改变它们的顺序,给你想要的结果。由于不是很有效,这个简单的算法仍然有助于理解排序方法是如何实现的,它不需要额外的空间,只对初始数组进行操作。下面是一个简单的实现,使用带do…while循环和for内部循环的布尔值:
public static void main(String[] args) {
int num[] = {5, -3, 0, -18, 1, 2, 0};
int temp = 0;
boolean finished = false;
do{
finished = true; // This will stay true if nothing needs to be changed in your array.
for (int i = 0 ; i < num.length - 1 ; i++){
if (num[i] > num[i+1]){
finished = false; // Can not go off the loop if it is not sorted yet.
temp = num[i]; // Interchanging of array's indexes
num[i] = num[i+1];
num[i+1] = temp;
}
}
} while(!finished);
System.out.println(Arrays.toString(num));
}
下面是一个简单的实现,使用带有do…while循环和for内部循环的布尔值:
public static void main(String[] args) {
int num[] = {5, -3, 0, -18, 1, 2, 0};
int temp = 0;
boolean finished = false;
do{
finished = true; // This will stay true if nothing needs to be changed in your array.
for (int i = 0 ; i < num.length - 1 ; i++){
if (num[i] > num[i+1]){
finished = false; // Can not go off the loop if it is not sorted yet.
temp = num[i]; // Interchanging of array's indexes
num[i] = num[i+1];
num[i+1] = temp;
}
}
} while(!finished);
System.out.println(Arrays.toString(num));
}
您可以将Arrays.sort与自定义比较器一起使用,该比较器将保留等号数字的顺序:
Integer[] num = {5, -3, 0, -18, 1, 2, 0};
Arrays.sort(num, (a, b) -> Integer.signum(a) - Integer.signum(b));
System.out.println(Arrays.toString(num)); // [-3, -18, 0, 0, 5, 1, 2]
编辑:既然OP只是想要一个普通的排序,那就太好了
Arrays.sort(num);
您可以将Arrays.sort与自定义比较器一起使用,该比较器将保留等号数字的顺序:
Integer[] num = {5, -3, 0, -18, 1, 2, 0};
Arrays.sort(num, (a, b) -> Integer.signum(a) - Integer.signum(b));
System.out.println(Arrays.toString(num)); // [-3, -18, 0, 0, 5, 1, 2]
编辑:既然OP只是想要一个普通的排序,那就太好了
Arrays.sort(num);
有许多不同的排序可用于对整数数组进行排序,从简单的冒泡排序到稍微复杂的堆排序。有些排序比其他排序快,例如堆排序比冒泡排序快,但这主要影响大型数组。这是由于互换的数量和数字之间的比较 气泡排序 堆排序
有许多不同的排序可用于对整数数组进行排序,从简单的冒泡排序到稍微复杂的堆排序。有些排序比其他排序快,例如堆排序比冒泡排序快,但这主要影响大型数组。这是由于互换的数量和数字之间的比较 气泡排序 堆排序
如果您有二维数组,可以根据每个数组的第一个元素或第二个元素对其进行排序,如下所示: 例如,我们想要排序 arr=[-2147483646,-2147483645],[21474836462147483647]]基于每个数组的第二个元素。我们在最新的Java8中这样做 Arrays.sortarr、Comparator.comparingInta->a[1]
这将处理正整数和负整数。如果您有二维数组,可以根据每个数组的第一个元素或第二个元素对其进行排序,如下所示: 例如,我们想要排序 arr=[-2147483646,-2147483645],[21474836462147483647]]基于每个数组的第二个元素。我们在最新的Java8中这样做 Arrays.sortarr、Comparator.comparingInta->a[1]
这将考虑正整数和负整数。时间复杂度:On,空间复杂度:O1
public void sortNumbers(int[] nums) {
int start = 0;
int end = nums.length - 1;
int index = 0;
while (start < end && index <= end) {
if (nums[index] < 0) {
int temp = nums[index];
nums[index] = nums[start];
nums[start] = temp;
start++;
index++;
} else if (nums[index] > 0) {
int temp = nums[index];
nums[index] = nums[end];
nums[end] = temp;
end--;
} else {
index++;
}
}
System.out.println(Arrays.toString(nums));
}
时间复杂度:On,空间复杂度:O1
public void sortNumbers(int[] nums) {
int start = 0;
int end = nums.length - 1;
int index = 0;
while (start < end && index <= end) {
if (nums[index] < 0) {
int temp = nums[index];
nums[index] = nums[start];
nums[start] = temp;
start++;
index++;
} else if (nums[index] > 0) {
int temp = nums[index];
nums[index] = nums[end];
nums[end] = temp;
end--;
} else {
index++;
}
}
System.out.println(Arrays.toString(nums));
}
我不懂排序逻辑,你能展开一点吗?我需要在数组求值时有负数,后面是零,最后是正数。@Tunaki将一个未排序的数组变成另一个未排序的数组…?好的,但是,是否应该有关于正数的排序规则呢?之所以只对负数进行排序,是因为在循环中,你只是比较0。我不理解排序逻辑,你能扩展一下吗?我需要在数组中求负数,然后是零,最后是正数。@Tunaki将一个未排序的数组转换为另一个未排序的数组…?好的,但是是否应该有任何关于正数的排序规则?它只对负数排序的原因是因为在循环中,您只将其与0进行比较。这与使用算法有什么不同?@dguay我的朋友。排序一点也不好玩。@dguay array.Sort
它的实现非常简单differently@SashaSalauyou也许,但是Arrays.sort输出是一样的。如果他只是想对数组进行排序,为什么需要实现新的排序算法?就像“肉桂回答”…这和使用算法有什么不同?@dguay我的朋友。排序一点也不好玩。@dguay Arrays.Sort的实现非常简单differently@SashaSalauyou也许,但是Arrays.sort输出是一样的。如果他只是想对数组进行排序,为什么需要实现新的排序算法?就像@肉桂回答…Integer.signum可能是一个更好的选择。加上一个lambda是我视图中最干净的方法Integer.signum可能是一个更好的选择。加上一个lambda是我视图中最干净的方法首先我误解了你的问题,我只是根据实际需要编辑了我的答案。首先我误解了你的问题,我刚刚编辑了我的答案,以符合实际要求我认为循环终止条件I