目录
选择排序
时间复杂度:O(n2)
空间复杂度(额外的空间):O(1)
稳定否:不稳定 (如何两相等的数进行排序,排序后它们的相对位置可能发生变化,比如:a与b相等,排序前a在b前,排序后a依然在b前就是稳定,b在a前就是不稳定)比如 2 2 1 5 6
文字描述:找到数组的最小值,将它与数组的第一个位置的值进行交换,然后找到剩下数组的最小值,将它与数组的第二个位置的进行交换,重复此操作直至整个数组排好序。
代码实现:
public static void selectSort(int[] nums) {
int minIndex;
// 当只有一位时,它所在的位置就是正确的位置。故只需要找前length - 1位
for (int i = 0; i < nums.length - 1; i++) {
minIndex = i;
// 找出从i 到 length 的最小值的下标
for (int j = i + 1; j < nums.length; j++) {
if (nums[j] < nums[minIndex]) minIndex = j;
}
if (minIndex != i) {
nums[i] = nums[i] ^ nums[minIndex];
nums[minIndex] = nums[i] ^ nums[minIndex];
nums[i] = nums[i] ^ nums[minIndex];
}
}
}
优化是:同时找出最小与最大值,进行交换。
代码优化:
public static void selectSort(int[] nums) {
int minIndex, maxIndex;
for (int i = 0, j = nums.length - 1; i < j; i++, j--) {
minIndex = i;
maxIndex = j;
// 计算时从i到j的最大最小值,不能减一
for (int k = i; k <= j; k++) {
if (nums[k] < nums[minIndex]) minIndex = k;
if (nums[k] > nums[maxIndex]) maxIndex = k;
}
if (minIndex != i) swap(nums, minIndex, i);
// 当i所在位置时时最大值,而i又与minIndex交换了值,所以最大值所在位置已经在minIndex
if (i == maxIndex) maxIndex = minIndex;
if (maxIndex != j) swap(nums, maxIndex, j);
}
}
持续更新中