和冒泡排序一样,选择排序也是蛮力法的一种实际应用。

 

  选择排序的思想,就是首先扫描整个数组,找到最小的元素,然后和第一个元素进行交换,如此一来就等同于将最小的元素放到它在有序表中最终的位置上。然后从第二个元素开始扫描整个表,找到剩余n-1个元素中最小的元素,与第二个元素交换位置。以此类推,在执行n-1遍之后,这个数组就自然有序了。(当然每次找最大的元素,与最后一个元素交换也是可行的)

 

  先用一个具体的场景来体会一下选择排序的过程。

场景:

现有一个无序数组,共7个数:89 45 68 90 29 34 17。

使用选择排序对这个序列进行升序排序。

基础选择排序实现过程:

89 45 68 90 29 34 17

17 45 68 90 29 34 89 ;

17 29 68 90 45 34 89

17 29 34 90 45 68 89

17 29 34 45 90 68 89

17 29 34 45 68 90 89

17 29 34 45 68 89 90 ;

 

  可以很明显的发现,选择排序有一个最明显的优于冒泡排序的地方:数据交换的次数。在选择排序中,一共最多产生n-1次交换(有时当剩余数组第一个值就是最小值的时候甚至不需要进行交换),虽然选择排序的时间复杂度也是O(n^2)。另外顺便说一句,选择排序的空间复杂度也是O(1)

 

 

  附上基础选择排序的代码:

 1     public static void basal(int[] array) {
 2         if (array == null || array.length < 2) {
 3             return;
 4         }
 5         // 最小元素坐标
 6         int minIndex;
 7         for (int i = 0; i < array.length; i++) {
 8             // 每次循环开始,重置坐标
 9             minIndex = i;
10             // 前i个已经有序
11             // 内循环的任务是在[i,array.length-1]的区间中找出最小的元素的位置,和第i项交换
12             for (int j = i; j < array.length; j++) {
13                 if (array[j] < array[minIndex]) {
14                     minIndex = j;
15                 }
16             }
17             // 判断第一个是不是最小值,是的话可以不用交换
18             if (i != minIndex) {
19                 swap(i, minIndex, array);
20             }
21         }
22     }
basal

相关文章: