Java排序算法

快速排序的原理:選擇一個關鍵值做爲基準值。比基準值小的都在左邊序列(通常是無序的),比基準值大的都在右邊(通常是無序的)。java

從後往前比較,用基準值和最後一個值比較,若是比基準值小的交換位置,若是沒有繼續比較下一個,直到找到第一個比基準值小的值才交換。找到這個值以後,又從前日後開始比較,若是有比基準值大的,交換位置,若是沒有繼續比較下一個,直到找到第一個比基準值大的值才交換。直到從前日後的比較索引>從後往前比較的索引,結束第一次循環,此時,對於基準值來講,左右兩邊就是有序的了。算法

接着分別比較左右兩邊的序列,重複上述的循環。數組

直接上代碼:ide

package Sort;blog

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;排序

import sun.nio.cs.FastCharsetProvider;遞歸

//基本數據類型四種排序算法總結索引

public class SortAll {io

    
    public static void main(String [] args){
        int []arr={8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6,8,1,3,5,2,9,11,5,7,0,6};
        long len=System.currentTimeMillis();
        fastIndex(arr);//12毫秒
        //maoPaoSort(arr);//冒泡排序用時平均4.25毫秒
        //selectSort(arr);//選擇排序用時平均2.5毫秒
        //insertSort(arr);//插入排序用時平均1.6毫秒
        //Arrays.sort(arr);//用時不到1毫秒  更快,對於數組長度大於286 且不規則數組,採用雙軸快速排序算法
        long end=System.currentTimeMillis();
        System.out.println(end-len);
        for(int k=0;k<arr.length;k++){
            System.out.print(arr[k]+",");
        }
    }
    一.快速排序ast

    //  從第一個值開始,人爲是中間值,從後往前依次比較,找到比他小的,替換位置,而後從前日後比較,找到比他大的交換這樣一次循環結束,遞歸比較左右兩側     public static void fastIndex(int [] arg) {         int start=0;         int end=arg.length-1;         fastSort(arg,start,end);     }     public static void fastSort(int [] arr,int low,int high){         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){                 fastSort(arr,low, start-1);             }             if(end<high&&end-1!=start){                 fastSort(arr,end+1, high);             }         }     }         二.冒泡排序法   從小到大  往上冒小值       //冒泡排序用時平均4.25毫秒,冒泡排序比選擇排序交換數據次數要多     public static void maoPaoSort(int[] arr){         int len=arr.length;         int temp;         //1)一種方式是:外層決定循環多少次,每次循環找出一個小值冒泡,每次外層循環結束 最後一個值是最大的         /*for(int i=0;i<len-1;i++){             for(int j=0;j<len-1-i;j++){                 if(arr[j]>arr[j+1]){                     temp=arr[j];                     arr[j]=arr[j+1];                     arr[j+1]=temp;                 }             }         }*/         //2)一種方式是:外層決定循環多少次,每次外層循環結束 找出一個最小值,最大值下沉,第一個值是最小的          for (int i=0;i<len-1;i++){             for(int j=len-1;j>i;j--){                 if(arr[j-1]>arr[j]){                     temp=arr[j-1];                     arr[j-1]=arr[j];                     arr[j]=temp;                 }             }         }     }          三.選擇排序  外層循環默認第一個值爲最小的,每次外層循環結束後找出一個最小值放到第當前外層循環第一位置。     //選擇排序用時平均2.5毫秒  選擇排序比冒泡排序交換數據次數少,節省時間     public static void selectSort(int[] arr){         int min;         int minIndex;         for (int i = 0; i < arr.length; i++) {             min=arr[i];             minIndex=i;             for(int j=i+1;j<arr.length;j++){                 if(arr[j]<min){                     min=arr[j];                     minIndex=j;                 }             }                          if(minIndex!=i){                 int temp=arr[i];                 arr[i]=min;                 arr[minIndex]=temp;             }         }     }     四.插入排序   對於數值大的靠後  節省時間,插入排序至關於只有須要後一個 值比前面的小才循環移動,若是第一個就沒遇到,前面的值也不須要循環,節省循環次數及移動次數     //優先選擇     public static void insertSort(int[] arr){                  for(int i=1;i<arr.length;i++){             int nextValue=arr[i];             int preIndex=i-1;                          while(preIndex>=0&&nextValue<arr[preIndex]){                 arr[preIndex+1]=arr[preIndex];                 preIndex--;             }             if(i!=preIndex+1){                 arr[preIndex+1]=nextValue;             }         }              } }

相關文章
相關標籤/搜索