选择排序
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
时间复杂度
选择排序的交换操作介于 0 和 (n - 1) 次之间。选择排序的比较操作为 n (n - 1) / 2 次之间。选择排序的赋值操作介于 0 和 3 (n - 1) 次之间。比较次数O(n^2),比较次数与关键字的初始状态无关,总的比较次数N=(n-1)+(n-2)+...+1=n*(n-1)/2。交换次数O(n),最好情况是,已经有序,交换0次;最坏情况交换n-1次,逆序交换n/2次。交换次数比冒泡排序少多了,由于交换所需CPU时间比比较所需的CPU时间多,n值较小时,选择排序比冒泡排序快。
算法稳定性
选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。
选择排序代码
通过外循环,默认第一个数为最小下标,赋值于k,通过内循环找到比k下标还小的数,并记录下来,内循环找到这一趟排序的最小记录下来,然后与外循环的最小对比,如果2者不相等就替换位置。即k永远保持待排序数据中最小的数的下标,最后和当前位置i互换数据即可。
package com.roc.select; /** * 选择排序 * @author liaowp * */ public class SelectSort { public static void main(String[] args) { int[] data={99,45,32,56,12}; int i,j,k,temp=0; System.out.print("原始数据"); print(data); System.err.println(); for (i = 0; i < data.length-1; i++) {//外循环,循环的次数是length-1 k=i;//默认把第i个当成最小或最大的 并记录下来 for (j = i+1; j < data.length; j++) {//内循环,对比的次数=length-i if(data[j]<data[k])//如果第j个数小于第k(刚刚记录的最大或者最小)的数,就把它记录下来 k=j; if(k!=i){//如果最大或者最小的数不是自己,就替换位置 temp=data[i]; data[i]=data[k]; data[k]=temp; System.err.println(); print(data); System.err.println(); } } } //print(data); } public static void print(int[] array){ for (int i = 0; i < array.length; i++) { System.err.print(array[i]+" "); } } }
原始数据99 45 32 56 12
45 99 32 56 12
32 99 45 56 12
45 99 32 56 12
12 99 32 56 45
12 32 99 56 45
12 56 99 32 45
12 32 99 56 45
12 32 56 99 45
12 32 45 99 56
12 32 45 56 99