四大排序之比較和總結

本人在複習core java之時,將四大排序拿出來,封裝成了工具方法,給學過的同學溫習和總結下,也給新來的同學增加下知識。

下面爲工具方法,已封裝成工具類,有興趣的同學,可以複製過去,以備調用。


package org.tarena.liyunhua.utils;

import java.util.Arrays;
import java.util.Random;

public class SortUtil {
   /**
    * 冒泡排序,param參數,asc爲升序,desc爲降序
    *
    * @param arr
    * @param param
    * @return
    */
   public static int[] maopao(int[] arr, String param) {
       int t;
       for (int i = 0; i < arr.length; i++) {
           for (int j = 0; j < arr.length - 1-i; j++) {
               if (param.equals("asc")) {
                   if (arr[j + 1] < arr[j]) {
                       t = arr[j + 1];
                       arr[j + 1] = arr[j];
                       arr[j] = t;
                   }
               } else if (param.equals("desc")) {
                   if (arr[j] < arr[j + 1]) {
                       t = arr[j + 1];
                       arr[j + 1] = arr[j];
                       arr[j] = t;
                   }
               }

           }
       }
       return arr;
   }

   /**
    * 冒泡排序,默認asc方式排序
    * 基本思路:相鄰兩個數,比較大小,升序,大的交換位置下沉。降序,小的交換位置也往下沉.
    * @param arr
    * @return
    */
   public static int[] maopao(int[] arr) {
       int t;
       for (int i = 0; i < arr.length; i++) {
           for (int j = 0; j < arr.length - 1-i; j++) {
               if (arr[j + 1] < arr[j]) {
                   t = arr[j + 1];
                   arr[j + 1] = arr[j];
                   arr[j] = t;
               }

           }
       }
       return arr;
   }

   /**
    * 插入排序,param參數,asc爲升序,desc爲降序
    */
   public static int[] insertSort(int[] arr, String param) {
       for (int i = 1; i < arr.length; i++) {
           int k = arr[i];
           int j;
           if ("asc".equals(param.toLowerCase())) {
               for (j = i - 1; j >= 0 && k < arr[j]; j--) {
                   arr[j + 1] = arr[j];
               }
               arr[j + 1] = k;
           } else if ("desc".equals(param.toLowerCase())) {
               for (j = i - 1; j >= 0 && k > arr[j]; j--) {
                   arr[j + 1] = arr[j];
               }
               arr[j + 1] = k;
           }

       }
       return arr;
   }

   /**
    * 插入排序,默認asc排序

   *基本思路:將要排序的數組分成兩部分,每次從後面的數組部分中取出索引最小的數組元素,
   *插入到前面數組部分的適當位置中。通常用在開始排序時,將數組的第一個
   *元素作爲一組,後面的所有元素被當成另一組。
    */
   public static int[] insertSort(int[] arr) {
       for (int i = 1; i < arr.length; i++) {
           int k = arr[i];
           int j;
           for (j = i - 1; j >= 0 && k < arr[j]; j--) {
               arr[j + 1] = arr[j];
           }
           arr[j + 1] = k;
       }
       return arr;
   }


   /**
    * 選擇排 ,默認升序

   *基本思路:將要排序的數組分成兩部分,一部分是從小到大已經排序好的,一部是無序的,
   *從無序的部分取出最小的數組,放到已經排好序的部分的最後。
    * @param args
    */
   public static int[] xuanze(int[] arr){
       int t;
       for(int i=0;i<arr.length;i++){
           int m=i;
           for(int j=i+1;j<arr.length;j++){
               if(arr[j]<arr[m]){
                   m=j;
               }
           }
           if(i!=m){
               t=arr[i];
               arr[i]=arr[m];
               arr[m]=t;
           }
       }
       return arr;
   }


   /**
    * 選擇排序 ,param參數,asc爲升序,desc爲降序
    * @param args
    */
   public static int[] xuanze(int[] arr,String param){
       int t;
       for(int i=0;i<arr.length;i++){
           int m=i;
           for(int j=i+1;j<arr.length;j++){
               if("asc".equals(param.toLowerCase())){
                   if(arr[j]<arr[m]){
                       m=j;
                   }
               }else if("desc".equals(param.toLowerCase())){
                   if(arr[j]>arr[m]){
                       m=j;
                   }
               }

           }
           if(i!=m){
               t=arr[i];
               arr[i]=arr[m];
               arr[m]=t;
           }
       }
       return arr;
   }


   /**
    * 產生一個length長度的隨機數組,方法
    * @param length
    * @return
    */
   public static int[] randomArrays(int length){
       int[] arr = new int[length];
       for (int i = 0; i < arr.length; i++) {
           arr[i]=new Random().nextInt(8888);
       }
       return arr;
   }


//快速排序,基本思路:將一個大的數組的排序問題,分解成2個小的數組的排序,而每個小的數組的排序,
//又可繼續分解成更小的2個數組,這樣一直遞歸分解下去,直到數組的大小最大爲2。


//下面是用main進行測試
   public static void main(String[] args) {

       int[] arr=SortUtil.randomArrays(8888);
       //選擇排序
       //System.out.println("選擇排序隨機數組爲: "+Arrays.toString(arr));
       System.out.println("----------選擇排序 開始----------");
       long start=System.currentTimeMillis();
       SortUtil.xuanze(arr);
       //System.out.println(Arrays.toString(arr));
       System.out.println("選擇排序用時      "+(System.currentTimeMillis()-start)+"  毫秒");
       System.out.println("----------選擇排序 結束----------");

       arr=SortUtil.randomArrays(8888);
       //插入排序
       //System.out.println("插入排序隨機數組爲: "+Arrays.toString(arr));
       System.out.println("----------插入排序 開始----------");
       start=System.currentTimeMillis();
       SortUtil.insertSort(arr);
       //System.out.println(Arrays.toString(arr));
       System.out.println("插入排序用時      "+(System.currentTimeMillis()-start)+"  毫秒");
       System.out.println("----------插入排序 結束----------");


       arr=SortUtil.randomArrays(8888);
       // 冒泡排序
       //System.out.println("冒泡排序隨機數組爲: "+Arrays.toString(arr));
       System.out.println("----------冒泡排序開始----------");
       start=System.currentTimeMillis();
       SortUtil.maopao(arr);
       //System.out.println(Arrays.toString(arr));
       System.out.println("冒泡排序 用時      "+(System.currentTimeMillis()-start)+"  毫秒");
       System.out.println("----------冒泡排序 結束----------");

       arr=SortUtil.randomArrays(8888);
       // 快速排序(Arrays.sort)
       //System.out.println("快速排序隨機數組爲: "+Arrays.toString(arr));
       System.out.println("----------快速排序 開始----------");
       start=System.currentTimeMillis();
       Arrays.sort(arr);
       //System.out.println(Arrays.toString(arr));
       System.out.println("快速排序 用時      "+(System.currentTimeMillis()-start)+"  毫秒");
       System.out.println("----------快速排序 結束----------");
   }
}

隨機產生8888位數組,下面爲測試結果

----------選擇排序 開始----------
選擇排序用時      94  毫秒
----------選擇排序 結束----------


----------插入排序 開始----------
插入排序用時      47  毫秒
----------插入排序 結束----------


----------冒泡排序開始----------
冒泡排序 用時      203  毫秒
----------冒泡排序 結束----------


----------快速排序 開始----------
快速排序 用時      16  毫秒
----------快速排序 結束----------

總結:

快速排序,16毫秒,當之無愧第一名

插入排序,47毫秒 ,    排在第二名

選擇排序,94毫秒,     排在第三名

冒泡排序,203毫秒,遠遠落最後名


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章