`
keepwork
  • 浏览: 325363 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java算法--选择排序

 
阅读更多

选择排序的基本思想是遍历数组的过程中,以 i 代表当前需要排序的序号,则需要在剩余的 [i…n-1] 中找出其中的最小值,然后将找到的最小值与 i 指向的值进行交换。因为每一趟确定元素的过程中都会有一个选择最大值的子流程,所以人们形象地称之为选择排序。

举个实例来看看:

  1. 初始: [381716167313932211]  
  2.  
  3. i = 0:  [2 , 171616731393238 , 11] (0th [38]<->8th [2])  
  4.  
  5. i = 1:  [27 , 161617 , 3139323811] (1st [38]<->4th [17])  
  6.  
  7. i = 2:  [2711 , 16173139323816 ] (2nd [11]<->9th [16])  
  8.  
  9. i = 3:  [271116173139323816] ( 无需交换 )  
  10.  
  11. i = 4:  [27111616 , 3139323817 ] (4th [17]<->9th [16])  
  12.  
  13. i = 5:  [2711161617 , 39323831 ] (5th [31]<->9th [17])  
  14.  
  15. i = 6:  [271116161731 , 323839 ] (6th [39]<->9th [31])  
  16.  
  17. i = 7:  [271116161731323839] ( 无需交换 )  
  18.  
  19. i = 8:  [271116161731323839] ( 无需交换 )  
  20.  
  21. i = 9:  [271116161731323839] ( 无需交换 ) 

由例子可以看出,选择排序随着排序的进行( i 逐渐增大),比较的次数会越来越少,但是不论数组初始是否有序,选择排序都会从 i 至数组末尾进行一次选择比较,所以给定长度的数组,选择排序的比较次数是固定的: 1 + 2 + 3 + …. + n = n * (n + 1) / 2 ,而交换的次数则跟初始数组的顺序有关,如果初始数组顺序为随机,则在最坏情况下,数组元素将会交换 n 次,最好的情况下则可能 0 次(数组本身即为有序)。

由此可以推出,选择排序的时间复杂度和空间复杂度分别为 O(n2 ) 和 O(1) (选择排序只需要一个额外空间用于数组元素交换)。

实现代码:

 

/**  
 * Selection Sorting  
 */ 
SELECTION(new Sortable() {  
    public <T extends Comparable<T>> void sort(T[] array, boolean ascend) {  
        int len = array.length;  
        for (int i = 0; i < len; i++) {  
            int selected = i;  
            for (int j = i + 1; j < len; j++) {  
                int compare = array[j].compareTo(array[selected]);  
                if (compare != 0 && compare < 0 == ascend) {  
                    selected = j;  
                }  
            }  
 
            exchange(array, i, selected);  
        }  
    }  
}) 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics