选择排序
一、选择排序的思想
第一次,找出序列中最小的数与第一个数交换。
第二次,找出序列中最小的数与第二个数交换。
第n次 ,找出序列中最小的数与第n 个数交换。
如此反复,直到序列有序。这种方法叫做选择排序,它是在不断的选择剩余元素中的最小者。
二、简单选择排序算法
1 /** 2 * 选择排序 3 * 4 * 选择排序的思想: 5 * 第一次,找出序列中最小的数与第一个数交换。 6 * 第二次,找出剩余序列中最小的数与第二个数交换。 7 * 第n次 ,找出剩余序列中最小的数与第n个数交换。 如此反复,直到序列有序。 8 * 这种方法叫做选择排序,它是在不断的选择剩余元素中的最小者。 9 * 10 * @author lp 11 * 12 */ 13 public class SelectSort { 14 15 public static int[] selectSort(int[] array) { 16 int N = array.length; 17 int position = 0; 18 for (int i = 0; i < N; i++) { 19 position = i;// 暂存当前最小值位置 20 int temp = array[i];// 暂存当前最小值 21 // 查找剩余序列中的最小值 22 for (int j = i + 1; j < N; j++) { 23 if (array[j] < temp) { 24 position = j;// 记录新最小值所在的位置 25 temp = array[j];// 记录新最小值 26 } 27 } 28 //整趟循环完后才进行交换 29 array[position] = array[i];// 新最小值位置存放当前最小值 30 array[i] = temp;// 当前最小值位置存放新最小值 31 } 32 return array; 33 } 34 35 public static void main(String[] args) { 36 int[] array = { 1, 54, 6, 3, 78, 34, 12, 45 }; 37 38 selectSort(array); 39 40 for (int element : array) { 41 System.out.print(element + " "); 42 } 43 } 44 }
时间复杂度:
比较次数:
无论初始序列如何,其比较次数都是一样多,第i趟排序需要进行n-i次比较,总共要进行n(n-1)/2次比较。
交换次数:
最好情况,也就是初始为顺序时,交换次数为0。
最差情况,也就是初始为逆序时,交换次数为n-1次。
最终的排序时间=比较次数+交换次数。因此总的时间复杂度为O(n^2)
因为简单选择排序没有利用上次选择时比较的结果,所以造成了比较次数多,速度慢。如果能够加以改进,将会提高排序的速度,所以出现了后面的树形选择排序和堆排序。
三、树形选择排序和堆排序
堆排序算法:http://www.cnblogs.com/rouqinglangzi/p/7521769.html
不积跬步,无以至千里。不积小流,无以成江海!