講一講經典的排序算法,選擇排序算法。
選擇排序的大致思想比較簡單,就是在數組中每次循環比較的時候將最小的元素和當次循環的第一個元素交換位置,循環結束後,所有的元素便完成排序。
選擇排序有兩個特點:運行時間和輸入無關。移動元素的次數最小。
運行時間和輸入無關:無論數據是否已經排序成功,選擇排序都是要進行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]+" ");
}
}
}
以上就是選擇排序的具體算法,總之,選擇排序是比較基礎的算法之一。