讲一讲经典的排序算法,选择排序算法。
选择排序的大致思想比较简单,就是在数组中每次循环比较的时候将最小的元素和当次循环的第一个元素交换位置,循环结束后,所有的元素便完成排序。
选择排序有两个特点:运行时间和输入无关。移动元素的次数最小。
运行时间和输入无关:无论数据是否已经排序成功,选择排序都是要进行N²/2的比较。因为不会利用上一次的比较结果,所以选择排序在数据较大的情况下会显的比较无力。
移动的次数最小:选择排序的特点之一。结合算法的思想可以知道,选择排序在移动次数上面是线性的。因为不论数据的多少,选择排序都是移动N次。其他的大部分算法都没有这一特点。
选择排序可能在数据非常大的情况下有些吃力,但是在数据比较小的情况下,选择排序有着自己的优势。甚至比一些出名的算法更好。比如快速排序。在数据较小的情况下,选择排序还是可以考虑的。这也为快速排序的优化提供了一个思路。这个以后再谈。
下面粘贴代码,因为选择排序比较容易理解,这里也不再详细的解释,其中的代码的注释也可以解释。
public class demo { public static void sort(Comparable[] a) { //选择排序 int N=a.length; for(int i=0;i<N;i++) { //标记单元 int min=i; for(int j=i+1;j<N;j++) { if(less(a[j], a[min])) { //交换这里要换点心思 min=j; } } exch(a, i, min);//提供的是要交换的数组中的数字的位置 } } private static boolean less(Comparable v,Comparable w) { //比较用来排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。 //如果v大于w,返回false return v.compareTo(w)<0; } public static void exch(Comparable[] a,int i,int j) { //交换位置 Comparable t=a[i]; a[i]=a[j]; a[j]=t; } //主方法 public static void main(String args[]) { //1 2 4 6 7 7 8 23 55 56 90 11个元素 Comparable[]a={1,4,2,6,7,55,8,23,7,90,56}; sort(a); for(int i=0;i<a.length;i++) { System.out.print(a[i]+" "); } } }
以上就是选择排序的具体算法,总之,选择排序是比较基础的算法之一。