选择排序
是一种简单直观的排序算法。
- 固定值与其他值依次比较,互换位置
- 记忆:外层
0 ~ <length-1
,i为固定值,内层i+1 ~ <length
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
public static void selectSort(int[] arr) { for (int i = 0; i < arr.length-1; i++) { for (int j = i+1; j < arr.length; j++) { if (arr[i] > arr[j]) { int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } } } }
|
它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。
选择排序是不稳定的排序方法。
原因是用数组实现的选择排序是不稳定的,用链表实现的选择排序是稳定的,因为数组内会破坏相同元素的位置,所以选择排序是不稳定的。
在《算法》第四版217页上作者已经说了,有很多办法可以将任意排序算法变成稳定的,但是,往往需要额外的时间或者空间。
【逻辑】外层0 ~ <length-1,i为固定值,内层i+1 ~ <length。固定值与其他值依次比较,互换位置
【优点】数据移动次数已知为(n-1)次
【缺点】比较次数多
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| public class TestArraySort { public static void main(String[] args) { int[] nums = {1, 8, 3, 6, 2, 9, 7, 4, 5}; selectSort(nums); for (int i = 0; i < nums.length; i++) { System.out.print(nums[i] + " "); } }
public static void selectSort(int[] array) { if (null == array || array.length == 0) { return; } for (int i = 0; i < array.length-1; i++) { for (int j = i + 1; j < array.length; j++) { if (array[i] > array[j]) { int tmp = array[i]; array[i] = array[j]; array[j] = tmp; } } } } }
|