資料結構中最常見的排序演算法-Java
1.選擇排序
a) 原理:每一趟從待排序的記錄中選出最小的元素,順序放在已排好序的序列最後,直到全部記錄排序完畢。也就是:每一趟在n-i+1(i=1,2,…n-1)個記錄中選取關鍵字最小的記錄作為有序序列中第i個記錄。基於此思想的演算法主要有簡單選擇排序、樹型選擇排序和堆排序。(這裡只介紹常用的簡單選擇排序)
b) 簡單選擇排序的基本思想:給定陣列:int[] arr={裡面n個數據};第1趟排序,在待排序資料arr[1]-arr[n]中選出最小的資料,將它與arrr[1]交換;第2趟,在待排序資料arr[2]-arr[n]中選出最小的資料,將它與r[2]交換;以此類推,第i趟在待排序資料arr[i]~arr[n]中選出最小的資料,將它與r[i]交換,直到全部排序完成。
具體程式碼實現:
public static int[] Select_Sort(int[] arr){
for(int i=0;i<arr.length-1;i++){
int k=i;
for(int j=k+1;j<arr.length;j++) {
if(arr[j]<arr[k]) {
k=j;
}
}
if (k!=i) {
int temp=arr[i];
arr[i]=arr[k];
arr[k]=temp;
}
}
return arr;
}
2.快速排序
快速排序的原理:選擇一個關鍵值作為基準值。比基準值小的都在左邊序列(一般是無序的),比基準值大的都在右邊(一般是無序的)。一般選擇序列的第一個元素。
一次迴圈:從後往前比較,用基準值和最後一個值比較,如果比基準值小的交換位置,如果沒有繼續比較下一個,直到找到第一個比基準值小的值才交換。找到這個值之後,又從前往後開始比較,如果有比基準值大的,交換位置,如果沒有繼續比較下一個,直到找到第一個比基準值大的值才交換。直到從前往後的比較索引>從後往前比較的索引,結束第一次迴圈,此時,對於基準值來說,左右兩邊就是有序的了。
接著分別比較左右兩邊的序列,重複上述的迴圈。類似於左右遞迴。
具體程式碼實現:
//快速排序:找一基準,通過過這個基準值,比基準值大的放在基準值的左邊,比基準值小的放在基準值的右邊 public static void Quick_Sort(int[] arr,int high,int low) { int start=low; int end=high; int key=arr[low]; while(end>start) { while(end>start && arr[end]>key) end--; if(arr[end]<=key) { int temp=arr[end]; arr[end]=arr[start]; arr[start]=temp; } while(end>start && arr[start]<key) start++; if(arr[start]>=key) { int temp=arr[start]; arr[start]=arr[end]; arr[end]=temp; } } if (start>low)Quick_Sort(arr,start-1,low); if (end<high)Quick_Sort(arr,high,end+1); }
3.氣泡排序
原理:比較兩個相鄰的元素,將值大的元素交換至右端。
思路:依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟:首先比較第1個和第2個數,將小數放前,大數放後。然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後。重複第一趟步驟,直至全部排序完成。
第一趟比較完成後,最後一個數一定是陣列中最大的一個數,所以第二趟比較的時候最後一個數不參與比較;
第二趟比較完成後,倒數第二個數也一定是陣列中第二大的數,所以第三趟比較的時候最後兩個數不參與比較;
依次類推,每一趟比較次數-1;
……
具體程式碼如下:
//氣泡排序:相鄰的兩個元素進行比較,每一次都有一個元素落到了最終的位置
public static void Bubble_Sort(int[] arr) {
for(int i=0;i<arr.length-1;i++) {
boolean flag=true;//主要是判斷此輪迴圈是否有交換元素,如果沒有,則跳出迴圈
//減i的原因是氣泡排序每一次都有一個元素落到最終的位置,這樣落到最終的位置的元素就可以不用再進行排序了
for(int j=1;j<arr.length-i;j++) {
if(arr[j-1]>arr[j]) {
int temp=arr[j-1];
arr[j-1]=arr[j];
arr[j]=temp;
flag=false;
}
}
if(flag==true) {
break;
}
}
}
還有其他的幾種排序也會做相應的說明