选择排序也是排序算法当中比较基础的排序之一;
其核心思想就是将第一个元素与后面的所有元素进行比较,如果比其他的元素大就进行交换,则经过一次比较之后第一个元素就会变成最小的元素,然后第二次从第二个元素一直到最后一个进行此操作,选择出第二小的元素放在第二个位置,依此类推。
给定数组:7 4 3 9 5 1。
第一趟:将7与4进行比较,大于4交换位置。然后将4与3进行比较,大于3交换位置。然后3与9进行比较,小于9位置不变,与5比较小于5,位置不变,与1比较大于1交换位置。
第一趟排序后的结果为:1 7 4 9 5 3
同理可得第二趟的排序后结果为:1 3 7 9 5 4
第三趟:1 3 4 9 7 5
第四趟:1 3 4 5 9 7
第五趟:1 3 4 5 7 9
排序完成。
下面是算法程序的实现:
public static void sort(int[] arr, int n){ for (int i = 0; i < n; i++) { for (int j = i; j < n; j++) { if (arr[i] > arr[j]){ swap(arr, i, j); } } } }
下面来考虑一下优化。我们每趟排序的时候选择出一个最小值,排序n-1次,比较的次数也是由n-1到1.显然时间复杂度是O(n²)
如果我们每次在决出一个最小值得同时决出一个最大值的话,效率明显会提升不少,循环的次数也会减半。
下面是优化后的程序。
public static void sort(int[] arr, int n){ int left = 0; int right = n-1; int min = 0; int max = 0; while (left < right){ min = left; max = right; for (int i = left; i <= right; i++) { if (arr[i] < arr[min]){ min = i; } if (arr[i] > arr[max]){ max = i; } } swap(arr, left, min); if (left == max){//如果在一次循环中,最大值刚好是最左边的元素,那么交换后的最大值下标就是min了,所以将min赋值给最大值的下标即可 System.out.println(arr[left]); max = min; } swap(arr, right, max); left++; right--; } }