排序算法不論在c語言,java,.net,php都很重要,冒泡排序、選擇排序、插入排序是用的比較多的。個人覺得冒泡排序比較好理解,無非就是交換位置的過程,如下所示
public class BubbleSort{ public static void main(String[] args){ int score[] = {67, 69, 75, 87, 89, 90, 99, 100}; for (int i = 0; i < score.length -1; i++){ //最多做n-1趟排序 for(int j = 0 ;j < score.length - i - 1; j++){ if(score[j] < score[j + 1]){ //把小的值交換到後面 int temp = score[j]; score[j] = score[j + 1]; score[j + 1] = temp; } } System.out.print("第" + (i + 1) + "次排序結果:"); for(int a = 0; a < score.length; a++){ System.out.print(score[a] + "\t"); } System.out.println(""); } System.out.print("最終排序結果:"); for(int a = 0; a < score.length; a++){ System.out.print(score[a] + "\t"); } } }
但是像選擇排序和插入排序理解起來會稍微困難一些,這2種排序和冒泡有很大的不同,先來看看插入排序
1.插入排序:
{{a1},{a2,a3,a4,…,an}}
{{a1⑴,a2⑴},{a3⑴,a4⑴ …,an⑴}}
…
{{a1(n-1),a2(n-1) ,…},{an(n-1)}}
每次處理就是將無序數列的第一個元素與有序數列的元素從後往前逐個進行比較,找出插入位置,將該元素插入到有序數列的合適位置中。
這種方式的排序主要就是爲待插入的數找合適位置,之後插入變爲新數組,在重複同樣的操作,下面是我寫的一段java代碼
package org.lxh; public class InsertSort { /** *插入排序 */ public static void main(String[] args) { int arr[]={23,6,45,8,7,24,-2}; for(int i=1;i<arr.length;i++){ //insertVal是準備插入的數 int insertVal=arr[i]; int insertIndex=i-1; //如果待插入的數小於前一個數,則把較大的數移動到後面 while(insertIndex>=0&&insertVal<arr[insertIndex]){ arr[insertIndex+1]=arr[insertIndex]; //考慮到類似-2這樣的情況,還必須往前面找合適位置 insertIndex--; } //到這裏爲止我們就爲要插入的數據找到了位置 arr[insertIndex+1]=insertVal; } for(int k=0;k<arr.length;k++){ System.out.println(arr[k]); } } }
對於這段代碼可能在 insertIndex-- 這個地方理解起來很困難,這裏這樣寫是爲了考慮類似-2的這種情況,不是交換一次就可以。
2.選擇排序,這種排序方式有稍微簡單些,一般就是先找一個最小的數,可以假設是任意一個,再和後面的比較如果後面的小於前面的說明假設不成立,則修改假設的值,之後交換。
下面是一點資料
選擇排序(Selection sort)是一種簡單直觀的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。
選擇排序的主要優點與數據移動有關。如果某個元素位於正確的最終位置上,則它不會被移動。選擇排序每次交換一對元素,它們當中至少有一個將被移到其最終位置上,因此對n個元素的表進行排序總共進行至多n-1次交換。在所有的完全依靠交換去移動元素的排序方法中,選擇排序屬於非常好的一種。
下面是java的代碼實現:
package org.lxh; public class SelectSort { /** * 選擇排序 */ public static void main(String[] args) { int arr[]={90,23,45,8,7,24}; int temp=0; for(int i=0;i<arr.length-1;i++){ //假設arr[i]是最小的數 int minVal=arr[i]; //最小的數對應的下標 int minIndex=i; //從後一個數知道數組末尾驗證我們前面的假設是否正確 for(int j=i+1;j<arr.length;j++){ //假設不成立,修改minVal和minIndex if(minVal>arr[j]){ minVal=arr[j]; minIndex=j; } } //交換 temp=arr[i]; arr[i]=arr[minIndex]; arr[minIndex]=temp; } for(int k=0;k<arr.length;k++){ System.out.println(arr[k]); } } }