选择排序
选择排序的思想是:双重循环遍历数组,
每经过一轮比较,找到最小元素的下标,将其交换至首位。
冒泡排序和选择排序有什么异同
相同点:
都是两层循环,时间复杂度都为 O(n^2);
都只使用有限个变量,空间复杂度 O(1)。
不同点:
冒泡排序在比较过程中就不断交换;
而选择排序增加了一个变量保存最小值 / 最大值的下标,
遍历完成后才交换,减少了交换次数。
非常重要的不同点:
冒泡排序法是稳定的,选择排序法是不稳定的。
排序算法的稳定性
假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i] = r[j],且 r[i] 在 r[j] 之前,而在排序后的序列中,r[i] 仍在 r[j] 之前,则称这种排序算法是稳定的;否则称为不稳定的。
举个例子,如果我们要对一组商品排序,商品存在两个属性:价格和销量。当我们按照价格从高到低排序后,要再按照销量对其排序,这时,如果要保证销量相同的商品仍保持价格从高到低的顺序,就必须使用稳定性算法。
排序数组
给你一个整数数组 nums
,请你将该数组升序排列。
输入:nums = [5,1,1,2,0,0]
输出:[0,0,1,1,2,5]
public class Demo4 {
static int[] arr=new int[] {
5,1,1,2,0,0
};
public static void main(String[] args) {
sortArray(arr);
System.out.println(Arrays.toString(arr));
}
static int maxIndex;
public static int[] sortArray(int[] nums) {
for (int i = 0; i < nums.length-1; i++) {
maxIndex=i;
for (int j = i+1; j < nums.length; j++) {
if (nums[maxIndex]>nums[j]) {
maxIndex=j;
}
}
swap(nums, i);
}
return nums;
}
private static void swap(int[] nums, int i) {
int temp=nums[i];
nums[i]=nums[maxIndex];
nums[maxIndex]=temp;
}
}