java面試中常用的排序算法

一、冒泡排序

  1. package sort.bubble;  
  2. import java.util.Random;  
  3. /** 
  4.  * 依次比較相鄰的兩個數,將小數放在前面,大數放在後面 
  5.  * 冒泡排序,具有穩定性 
  6.  * 時間複雜度爲O(n^2) 
  7.  * 不及堆排序,快速排序O(nlogn,底數爲2) 
  8.  * @author liangge 
  9.  * 
  10.  */  
  11. public class Main {  
  12.     public static void main(String[] args) {  
  13.         Random ran = new Random();  
  14.         int[] sort = new int[10];  
  15.         for(int i = 0 ; i < 10 ; i++){  
  16.             sort[i] = ran.nextInt(50);  
  17.         }  
  18.         System.out.print("排序前的數組爲");  
  19.         for(int i : sort){  
  20.             System.out.print(i+" ");  
  21.         }  
  22.         buddleSort(sort);  
  23.         System.out.println();  
  24.         System.out.print("排序後的數組爲");  
  25.         for(int i : sort){  
  26.             System.out.print(i+" ");  
  27.         }  
  28.     }  
  29.       
  30.     /** 
  31.      * 冒泡排序 
  32.      * @param sort 
  33.      */  
  34.     private static void buddleSort(int[] sort){  
  35.         for(int i=1;i<sort.length;i++){  
  36.             for(int j=0;j<sort.length-i;j++){  
  37.                 if(sort[j]>sort[j+1]){  
  38.                     int temp = sort[j+1];  
  39.                     sort[j+1] = sort[j];  
  40.                     sort[j] = temp;  
  41.                 }  
  42.             }  
  43.         }  
  44.     }  
  45. }  

 二、選擇排序

 

  1. package sort.select;  
  2. import java.util.Random;  
  3. /** 
  4.  * 選擇排序 
  5.  * 每一趟從待排序的數據元素中選出最小(或最大)的一個元素, 
  6.  * 順序放在已排好序的數列的最後,直到全部待排序的數據元素排完。  
  7.  * 選擇排序是不穩定的排序方法。 
  8.  * @author liangge 
  9.  *  
  10.  */  
  11. public class Main {  
  12.     public static void main(String[] args) {  
  13.         Random ran = new Random();  
  14.         int[] sort = new int[10];  
  15.         for (int i = 0; i < 10; i++) {  
  16.             sort[i] = ran.nextInt(50);  
  17.         }  
  18.         System.out.print("排序前的數組爲");  
  19.         for (int i : sort) {  
  20.             System.out.print(i + " ");  
  21.         }  
  22.         selectSort(sort);  
  23.         System.out.println();  
  24.         System.out.print("排序後的數組爲");  
  25.         for (int i : sort) {  
  26.             System.out.print(i + " ");  
  27.         }  
  28.     }  
  29.     /** 
  30.      * 選擇排序 
  31.      * @param sort 
  32.      */  
  33.     private static void selectSort(int[] sort){  
  34.         for(int i =0;i<sort.length-1;i++){  
  35.             for(int j = i+1;j<sort.length;j++){  
  36.                 if(sort[j]<sort[i]){  
  37.                     int temp = sort[j];  
  38.                     sort[j] = sort[i];  
  39.                     sort[i] = temp;  
  40.                 }  
  41.             }  
  42.         }  
  43.     }  
  44. }  

三、快速排序

 

  1. package sort.quick;  
  2. /** 
  3.  * 快速排序 通過一趟排序將要排序的數據分割成獨立的兩部分, 其中一部分的所有數據都比另外一部分的所有數據都要小, 
  4.  * 然後再按此方法對這兩部分數據分別進行快速排序, 整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。 
  5.  * @author liangge 
  6.  *  
  7.  */  
  8. public class Main {  
  9.     public static void main(String[] args) {  
  10.         int[] sort = { 5431893366126820 };  
  11.         System.out.print("排序前的數組爲:");  
  12.         for (int data : sort) {  
  13.             System.out.print(data + " ");  
  14.         }  
  15.         System.out.println();  
  16.         quickSort(sort, 0, sort.length - 1);  
  17.         System.out.print("排序後的數組爲:");  
  18.         for (int data : sort) {  
  19.             System.out.print(data + " ");  
  20.         }  
  21.     }  
  22.     /** 
  23.      * 快速排序 
  24.      * @param sort 要排序的數組 
  25.      * @param start 排序的開始座標 
  26.      * @param end 排序的結束座標 
  27.      */  
  28.     public static void quickSort(int[] sort, int start, int end) {  
  29.         // 設置關鍵數據key爲要排序數組的第一個元素,  
  30.         // 即第一趟排序後,key右邊的數全部比key大,key左邊的數全部比key小  
  31.         int key = sort[start];  
  32.         // 設置數組左邊的索引,往右移動判斷比key大的數  
  33.         int i = start;  
  34.         // 設置數組右邊的索引,往左移動判斷比key小的數  
  35.         int j = end;  
  36.         // 如果左邊索引比右邊索引小,則還有數據沒有排序  
  37.         while (i < j) {  
  38.             while (sort[j] > key && j > start) {  
  39.                 j--;  
  40.             }  
  41.             while (sort[i] < key && i < end) {  
  42.                 i++;  
  43.             }  
  44.             if (i < j) {  
  45.                 int temp = sort[i];  
  46.                 sort[i] = sort[j];  
  47.                 sort[j] = temp;  
  48.             }  
  49.         }  
  50.         // 如果左邊索引比右邊索引要大,說明第一次排序完成,將sort[j]與key對換,  
  51.         // 即保持了key左邊的數比key小,key右邊的數比key大  
  52.         if (i > j) {  
  53.             int temp = sort[j];  
  54.             sort[j] = sort[start];  
  55.             sort[start] = temp;  
  56.         }  
  57.         //遞歸調用  
  58.         if (j > start && j < end) {  
  59.             quickSort(sort, start, j - 1);  
  60.             quickSort(sort, j + 1, end);  
  61.         }  
  62.     }  
  63. }  

 

  1. /** 
  2.     * 快速排序 
  3.     *  
  4.     * @param a 
  5.     * @param low 
  6.     * @param high 
  7.     *            voidTest 
  8.     */  
  9.    public static void kuaisuSort(int[] a, int low, int high)  
  10.    {  
  11.        if (low >= high)  
  12.        {  
  13.            return;  
  14.        }  
  15.        if ((high - low) == 1)  
  16.        {  
  17.            if (a[low] > a[high])  
  18.            {  
  19.                swap(a, low, high);  
  20.                return;  
  21.            }  
  22.        }  
  23.        int key = a[low];  
  24.        int left = low + 1;  
  25.        int right = high;  
  26.        while (left < right)  
  27.        {  
  28.            while (left < right && left <= high)// 左邊向右  
  29.            {  
  30.                if (a[left] >= key)  
  31.                {  
  32.                    break;  
  33.                }  
  34.                left++;  
  35.            }  
  36.            while (right >= left && right > low)  
  37.            {  
  38.                if (a[right] <= key)  
  39.                {  
  40.                    break;  
  41.                }  
  42.                right--;  
  43.            }  
  44.            if (left < right)  
  45.            {  
  46.                swap(a, left, right);  
  47.            }  
  48.        }  
  49.        swap(a, low, right);  
  50.        kuaisuSort(a, low, right);  
  51.        kuaisuSort(a, right + 1, high);  
  52.    }  

四、插入排序

 

  1. package sort.insert;  
  2. /** 
  3.  * 直接插入排序 
  4.  * 將一個數據插入到已經排好序的有序數據中,從而得到一個新的、個數加一的有序數據 
  5.  * 算法適用於少量數據的排序,時間複雜度爲O(n^2)。是穩定的排序方法。 
  6.  */  
  7. import java.util.Random;  
  8. public class DirectMain {  
  9.     public static void main(String[] args) {  
  10.         Random ran = new Random();  
  11.         int[] sort = new int[10];  
  12.         for (int i = 0; i < 10; i++) {  
  13.             sort[i] = ran.nextInt(50);  
  14.         }  
  15.         System.out.print("排序前的數組爲");  
  16.         for (int i : sort) {  
  17.             System.out.print(i + " ");  
  18.         }  
  19.         directInsertSort(sort);  
  20.         System.out.println();  
  21.         System.out.print("排序後的數組爲");  
  22.         for (int i : sort) {  
  23.             System.out.print(i + " ");  
  24.         }  
  25.     }  
  26.     /** 
  27.      * 直接插入排序 
  28.      *  
  29.      * @param sort 
  30.      */  
  31.     private static void directInsertSort(int[] sort) {  
  32.         for (int i = 1; i < sort.length; i++) {  
  33.             int index = i - 1;  
  34.             int temp = sort[i];  
  35.             while (index >= 0 && sort[index] > temp) {  
  36.                 sort[index + 1] = sort[index];  
  37.                 index--;  
  38.             }  
  39.             sort[index + 1] = temp;  
  40.         }  
  41.     }  
  42. }  

 

順便添加一份,差不多的

  1. public static void charuSort(int[] a)  
  2.     {  
  3.         int len = a.length;  
  4.         for (int i = 1; i < len; i++)  
  5.         {  
  6.             int j;  
  7.             int temp = a[i];  
  8.             for (j = i; j > 0; j--)//遍歷i之前的數字  
  9.             {  
  10.                 //如果之前的數字大於後面的數字,則把大的值賦到後面  
  11.                 if (a[j - 1] > temp)  
  12.                 {  
  13.                     a[j] = a[j - 1];  
  14.                 } else  
  15.                 {  
  16.                     break;  
  17.                 }  
  18.             }  
  19.             a[j] = temp;  
  20.         }  
  21.     }  

 

把上面整合起來的一份寫法:

  1. /** 
  2.  * 插入排序: 
  3.  *  
  4.  */  
  5. public class InsertSort {  
  6.     public void sort(int[] data) {  
  7.         for (int i = 1; i < data.length; i++) {  
  8.             for (int j = i; (j > 0) && (data[j] < data[j - 1]); j--) {  
  9.                 swap(data, j, j - 1);  
  10.             }  
  11.         }  
  12.     }  
  13.       
  14.     private void swap(int[] data, int i, int j) {  
  15.         int temp = data[i];  
  16.         data[i] = data[j];  
  17.         data[j] = temp;  
  18.     }  
  19. }  

 五、順便貼個二分搜索法

 

  1. package search.binary;  
  2. public class Main {  
  3.     public static void main(String[] args) {  
  4.         int[] sort = {1,2,3,4,5,6,7,8,9,10};  
  5.         int mask = binarySearch(sort,6);  
  6.         System.out.println(mask);  
  7.           
  8.     }  
  9.       
  10.       
  11.     /** 
  12.      * 二分搜索法,返回座標,不存在返回-1 
  13.      * @param sort 
  14.      * @return 
  15.      */  
  16.     private static int binarySearch(int[] sort,int data){  
  17.         if(data<sort[0] || data>sort[sort.length-1]){  
  18.             return -1;  
  19.         }  
  20.         int begin = 0;  
  21.         int end = sort.length;  
  22.         int mid = (begin+end)/2;  
  23.         while(begin <= end){  
  24.             mid = (begin+end)/2;  
  25.             if(data > sort[mid]){  
  26.                 begin = mid + 1;  
  27.             }else if(data < sort[mid]){  
  28.                 end = mid - 1;  
  29.             }else{  
  30.                 return mid;  
  31.             }  
  32.         }  
  33.         return -1;  
  34.           
  35.     }  
  36. }  

原文地址:http://blog.csdn.net/spy19881201/article/details/5867721

發佈了29 篇原創文章 · 獲贊 5 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章