1. 程式人生 > >資料結構中最常見的排序演算法-Java

資料結構中最常見的排序演算法-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;
   }
  }   
 }

還有其他的幾種排序也會做相應的說明