/** * * SelectionSort 原理: 选择排序很简单,他的步骤如下: 1 . 从左至右遍历,找到最小(大)的元素,然后与第一个元素交换。 2 . 从剩余未排序元素中继续寻找最小(大)元素,然后与第二个元素进行交换。 3 . 以此类推,直到所有元素均排序完毕。 之所以称之为选择排序,是因为每一次遍历未排序的序列我们总是从中选择出最小的元素。 * */ /*选择排序需要花费 (N – 1) + (N – 2) + ... + 1 + 0 = N(N- 1) / 2 ~ N2/2次比较 和 N-1次交换操作。 对初始数据不敏感,不管初始的数据有没有排好序,都需要经历N2/2次比较,这对于一些原本排好序,或者近似排好序的序列来说并不具有优势。 在最好的情况下,即所有的排好序,需要0次交换,最差的情况,倒序,需要N-1次交换。 数据交换的次数较少,如果某个元素位于正确的最终位置上,则它不会被移动。在最差情况下也只需要进行N-1次数据交换,在所有的完全依靠交换去移动元素的排序方法中,选择排序属于比较好的一种。 */ /* 名称 最好 平均 最坏 内存占用 稳定排序 选择排序 O(n²) O(n²) O(n²) 1 是 时间复杂度最好和最坏都是O(N2) */ public class 选择排序 { public static void main(String[] args) { int[] nums =SortUtil.getArray(10); SelectionSort(nums); } public static void SelectionSort(int[] nums) { int n = nums.length; for (int i = 0; i < n; i++) { int min = i; //从第i+1个元素开始,找最小值 for (int j = i + 1; j < n; j++) { if (nums[min]>(nums[j])) min = j; } //找到之后和第i个元素交换 SortUtil.Swap(nums, i, min); } SortUtil.printAfterSortArray(nums); } }
public class SortUtil { public static int[] getArray(int length) { int nums[] =new int[length]; for (int i = 0 ; i < length ; i++){ nums[i] = (int)(Math.random()*100); } System.out.println("排序前:"); printArray(nums); return nums; } public static void printArray(int[] nums) { for (int i = 0 ; i < nums.length ; i++){ System.out.print(nums[i]+ " ");; } System.out.println(""); } public static void printAfterSortArray(int[] nums) { System.out.println("排序后:"); for (int i = 0 ; i < nums.length ; i++){ System.out.print(nums[i]+ " ");; } System.out.println(""); } public static void Swap(int[] array, int i, int min) { int temp = array[i]; array[i] = array[min]; array[min] = temp; } }