简单选择排序(选择排序)
简介:
简单选择排序的思想是:设排序序列的记录个数为n,进行n-1次选择,每次在n-i+1(i = 1,2,...,n-1)个记录中选择关键字最小的记录作为有效序列中的第i个记录。
例如,排序序列(57,68,59,52)的过程是,进行3次选择,第1次选择在4个记录中选择最小的值为52,放在第1个位置,得到序列(52,68,59,57),第2次选择从位置1开始的3个元素中选择最小的值57放在第2个位置,得到有序序列(52,57,59,68),第3次选择因为最小的值59已经在第3个位置不需要操作,最后得到有序序列(52,57,59,68)。
实现:
package suanfa; /* * 简单选择排序 */ public class EasySelect { public static void SelectionSort(int[] array) { for (int i = 0; i < array.length - 1; i++) { int min = i; // 每次从未排序数组中找到最小值的坐标 for (int j = i + 1; j < array.length; j++) { if (array[j] < array[min]) { min = j; } } // 将最小值放在最前面 if (min != i) { int temp = array[min]; array[min] = array[i]; array[i] = temp; } } } public static void print(int src[]) { for (int i = 0; i < src.length; i++) { System.out.print(src[i] + " "); } System.out.println(); } public static void main(String[] args) { // TODO Auto-generated method stub int array[]= {57,68,59,52}; print(array); SelectionSort(array); print(array); } }
分析:
简单选择排序过程中需要进行的比较次数与初始状态下待排序的记录序列的排列情况 无关。当i=1时,需进行n-1次比较;当i=2时,需进行n-2次比较;依次类推,共需要进行的比较次数是(n-1)+(n-2)+…+2+1=n(n-1)/2,即进行比较操作的时间复杂度为 O(n^2) ,进行移动操作的时间复杂度为 O(n) 。总的时间复杂度为 O(n^2) 。
最好情况下,即待排序记录初始状态就已经是正序排列了,则不需要移动记录。最坏情况下,即待排序记录初始状态是按第一条记录最大,之后的记录从小到大顺序排列,则需要移动记录的次数最多为3(n-1)。
简单选择排序是不稳定排序。
追梦的脚步,永不停息