java的幾種經典排序算法

 排序算法大體有直接插入排序、折半插入排序、Shell排序、歸併排序、直接選擇排序、堆排序、冒泡排序、快速排序、桶式排序、基數排序等這些種,各個算法都有其優異性,你們不妨本身看看。下面貼上每一個算法的簡單講解和實現:java

        1.直接選擇排序(DirectSelectSort):其關鍵就是對n個數據要進行n-1趟比較,每趟比較的目的就是選擇出本趟比較中最小的數據,並將選擇出的數據放在本趟中的第一位。實現以下:     算法

[java]  view plain copy
 
  1. <span style="font-size:18px;">public class DirectSelectSort {  
  2.               
  3.     //排序方法  
  4.     public static void directSelectSort(int[] data){  
  5.         int minData = 0;  
  6.         int index = 0;  
  7.         //進行n-1趟比較  
  8.         for(int i=0; i<data.length-1; i++){  
  9.             minData = data[i];  
  10.             index = i;  
  11.             for(int j=i+1; j<data.length; j++){  
  12.                 if(minData > data[j]){  
  13.                     minData = data[j];  
  14.                     index = j;  
  15.                 }  
  16.             }  
  17.             //一趟比較完後,交換一次  
  18.             data[index] = data[i];  
  19.             data[i] = minData;  
  20.         }  
  21.     }  
  22.       
  23.     public static void main(String args[]){  
  24.         int data[] = {22,34,12,32,50,67,43,32};  
  25.         System.out.print("排序前:");  
  26.         for(int i=0; i<data.length; i++){  
  27.             System.out.print(data[i]+" ");  
  28.         }  
  29.         System.out.println();  
  30.         directSelectSort(data);  
  31.         System.out.print("排序後:");  
  32.         for(int i=0; i<data.length; i++){  
  33.             System.out.print(data[i]+" ");  
  34.         }  
  35.     }  
  36.   
  37. }</span>  

            2.堆排序(HeapSort):先說下堆的概念,假設有n個數據元素的序列k0,k1,k2,k3,...,kn-1,當且僅當知足下列關係時,能夠將這組數據稱爲小頂堆,即ki <= k2i+1且 ki<= k2i+2(其中i=0,2,4,...,(n-1)/2);或者,知足以下關係成爲大頂堆,即ki >= k2i+1且 ki >= k2i+2(其中i=0,2,...,(n-1)/2)。若是將堆排成一棵徹底二叉樹,則小頂堆的特色是:樹中全部節點的值都小於其左右節點的值,且根節點的值最小;而大頂堆相反。堆排序的關鍵在於:1.建堆(大頂堆或小頂堆)2.拿堆的根節點和最後一個節點交換。ui

[java]  view plain copy
 
  1. <span style="font-size:18px;">public class HeapSort{  
  2.       
  3.     public static void heapSort(int[] data){  
  4.         //循環建堆  
  5.         for(int i=0; i<data.length-1; i++){  
  6.             buildMaxHeap(data, data.length-1-i);  
  7.             //交換棧頂和最後一個元素  
  8.             swap(data, 0, data.length-1-i);  
  9.         }  
  10.     }  
  11.       
  12.     public static void buildMaxHeap(int[] data, int lastIndex){  
  13.         //從最後一個節點的父節點開始  
  14.         for(int i=(lastIndex-1)/2; i>=0; i--){  
  15.             //保存當前正在判斷的節點  
  16.             int k = i;  
  17.             //若是當前k節點的子節點存在  
  18.             while(k*2+1 <= lastIndex){  
  19.                 int biggerIndex = 2*k+1;  
  20.                 if(biggerIndex < lastIndex){  
  21.                     if(data[biggerIndex] < data[biggerIndex+1]){  
  22.                         biggerIndex++;  
  23.                     }  
  24.                 }  
  25.                 if(data[k] < data[biggerIndex]){  
  26.                     //交換  
  27.                     swap(data, k, biggerIndex);  
  28.                     k = biggerIndex;  
  29.                 }else{  
  30.                     break;  
  31.                 }  
  32.             }  
  33.         }  
  34.     }  
  35.       
  36.     public static void swap(int[] data, int i, int j){  
  37.         int temp = data[i];  
  38.         data[i] = data[j];  
  39.         data[j] = temp;  
  40.     }  
  41.       
  42.     public static void main(String[] args){  
  43.         int data[] = {22,34,12,32,50,67,43,32};  
  44.         System.out.print("排序前:");  
  45.         for(int i=0; i<data.length; i++){  
  46.             System.out.print(data[i]+" ");  
  47.         }  
  48.         System.out.println();  
  49.         heapSort(data);  
  50.         System.out.print("排序後:");  
  51.         for(int i=0; i<data.length; i++){  
  52.             System.out.print(data[i]+" ");  
  53.         }  
  54.     }  
  55. }</span>  


          3. 冒泡排序(BubbleSort):冒泡排序是最簡單的排序算法之一,實現起來也比較簡單,其原理就是進行n-1趟比較並交換,小數往上冒,大數往下沉,通過n-1趟以後造成了有序的數列。spa

[java]  view plain copy
 
  1. <span style="font-size:18px;">public class BubbleSort {  
  2.       
  3.     public static void bubbleSort(int[] data){  
  4.         for(int i=0; i<data.length-1; i++){  
  5.             for(int j=0; j<data.length-i-1; j++){  
  6.                 if(data[j] > data[j+1]){  
  7.                     int temp = data[j];  
  8.                     data[j] = data[j+1];  
  9.                     data[j+1] = temp;  
  10.                 }  
  11.             }  
  12.         }  
  13.     }  
  14.       
  15.     public static void main(String[] args){  
  16.         int data[] = {22,34,12,32,50,67,43,32};  
  17.         System.out.print("排序前:");  
  18.         for(int i=0; i<data.length; i++){  
  19.             System.out.print(data[i]+" ");  
  20.         }  
  21.         System.out.println();  
  22.         bubbleSort(data);  
  23.         System.out.print("排序後:");  
  24.         for(int i=0; i<data.length; i++){  
  25.             System.out.print(data[i]+" ");  
  26.         }  
  27.     }  
  28.   
  29. }  
  30. </span>  


            4.快速排序(QuickSort): 快速排序死對 冒泡排序的一種改進,基本思想是:經過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的全部數據都比另一部分的全部數據都要小,而後再按此方法對這兩部分數據分別進行快速排序,整個排序過程能夠遞歸進行,以此達到整個數據變成有序序列。.net

[java]  view plain copy
 
  1. <span style="font-size:18px;">public class QuickSort {  
  2.   
  3.     public static void quickSort(int[] data, int start, int end){  
  4.   
  5.         if(start < end){  
  6.             //以第一個元素爲分界值  
  7.             int middleNum = data[start];  
  8.             int i = start;  
  9.             int j = end + 1;  
  10.             while(true){  
  11.                 //找到大於分界值的元素的索引或者已經到了end處  
  12.                 while(i<end && data[++i] <= middleNum);  
  13.                 //找到小於分界值的元素的索引或者已經到了start處  
  14.                 while(j>start && data[--j] >= middleNum);  
  15.                 if(i < j){  
  16.                     //交換  
  17.                     int temp = data[i];  
  18.                     data[i] = data[j];  
  19.                     data[j] = temp;  
  20.                 }else{  
  21.                     break;  
  22.                 }  
  23.             }  
  24.             int temp = data[start];  
  25.             data[start] = data[j];  
  26.             data[j] = temp;  
  27.             //遞歸左子序列  
  28.             quickSort(data, start, j-1);  
  29.             //遞歸右子序列  
  30.             quickSort(data, j+1, end);  
  31.         }         
  32.     }  
  33.   
  34.     public static void main(String[] args){  
  35.         int data[] = {22,34,12,32,50,67,43,32};  
  36.         System.out.print("排序前:");  
  37.         for(int i=0; i<data.length; i++){  
  38.             System.out.print(data[i]+" ");  
  39.         }  
  40.         System.out.println();  
  41.         quickSort(data, 0, data.length-1);  
  42.         System.out.print("排序後:");  
  43.         for(int i=0; i<data.length; i++){  
  44.             System.out.print(data[i]+" ");  
  45.         }  
  46.     }  
  47.   
  48. }  
  49. </span>  

                5.直接插入排序(DirectInsertSort):直接插入排序的思路很簡單,就是依次將帶排序的數據元素按其關鍵字排序的大小插入前面的有序序列。blog

[java]  view plain copy
 
    1. <span style="font-size:18px;">public class DirectInsertSort {  
    2.       
    3.     public static void directInsertSort(int[] data){  
    4.         for(int i=1; i<data.length; i++){  
    5.             for(int j=0; j<i; j++){  
    6.                 if(data[i] < data[j]){  
    7.                     //保存插入元素  
    8.                     int temp = 0;  
    9.                     temp = data[i];  
    10.                     //將要插入元素位置後的元素依次日後移  
    11.                     for(int m=i; m>j; m--){  
    12.                         data[m] = data[m-1];  
    13.                     }  
    14.                     //插入元素  
    15.                     data[j] = temp;  
    16.                 }  
    17.             }             
    18.         }  
    19.     }  
    20.       
    21.     public static void main(String[] args){  
    22.         int data[] = {22,34,12,32,50,67,43,32};  
    23.         System.out.print("排序前:");  
    24.         for(int i=0; i<data.length; i++){  
    25.             System.out.print(data[i]+" ");  
    26.         }  
    27.         System.out.println();  
    28.         directInsertSort(data);  
    29.         System.out.print("排序後:");  
    30.         for(int i=0; i<data.length; i++){  
    31.             System.out.print(data[i]+" ");  
    32.         }  
    33.     }  
    34.   
    35. }  
    36. </span>  
相關文章
相關標籤/搜索